前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[014]C语言

[014]C语言

作者头像
王小二
发布2020-06-08 10:47:01
13.3K0
发布2020-06-08 10:47:01
举报

前言

作为一个Android&&Java程序员的我,对C一直很抗拒,虽然自己也写过一些C的代码,但是还是不够精通,我决定写一个笔记记录一下C语言的知识点。

1.结构体的定义方式

代码语言:javascript
复制
1. 先定义结构体类型,再定义结构体变量。
struct student{
    char no[20];       //学号
    char name[20];    //姓名
     char sex[5];    //性别
    int age;          //年龄
};             
struct student stu1,stu2;
//此时stu1,stu2为student结构体变量

2. 定义结构体类型的同时定义结构体变量。
struct student{
    char no[20];        //学号
    char name[20];     //姓名
    char sex[5];      //性别
    int age;            //年龄
} stu1,stu2;
//此时还可以继续定义student结构体变量,如:
//struct student stu3;

3、不指定类型名而直接定义结构体变量
struct{
    char no[20];        //学号
    char name[20];      //姓名
    char sex[5];      //性别
    int age;          //年龄
} stu1,stu2;
//一般不使用这种方法,因为直接定义结构体变量stu1、stu2之后,就不能再继续定义该类型的变量。

4、用typedef定义结构体变量
typedef struct student
{
       char name[20];
       int age;
}student_t;
//上面的代码,定义了一个结构体变量类型,这个类型有2个名字:第一个名字是struct student;第二个类型名字是student_t.
//定义了这个之后,下面有2中方法可以定义结构体变量
//第一种: struct student student_1;   
//第二种:student_t student_1 
//推荐在实际代码中使用第四种方法定义结构体变量。

2.用结构体实现父类,子类模拟HAL层的代码

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void say() {
    printf("good mornin\n");
}

void work() {
    printf("I am working\n");
}

void cook() {
    printf("I am cooking\n");
}

typedef struct person {
    void (*say)();
} person;

typedef struct man {
    person p;

    void (*work)();
} man;

typedef struct woman {
    person p;

    void (*cook)();
} woman;

void get_person(int i, struct person **person) {
    if (i == 0) {
        man *m;
        m = (man *) malloc(sizeof(*m));
        memset(m, 0, sizeof(m));
        m->p.say = say;
        m->work = work;
        *person = &m->p;
    } else {
        woman *w;
        w = (woman *) malloc(sizeof(*w));
        memset(w, 0, sizeof(w));
        w->p.say = say;
        w->cook = cook;
        *person = &w->p;
    }
}

void get_man(struct man **m) {
    get_person(0, (struct person **) m);
}

void get_woman(struct woman **w) {
    get_person(1, (struct person **) w);
}

int main(int argc __unused, char **argv __unused) {
    man *m;
    get_man(&m);
    ((person *) m)->say();//向上转型成父类
    m->work();

    woman *w;
    get_woman(&w);
    ((person *) m)->say();
    w->cook();
}

2.#define宏的高级用法

https://blog.csdn.net/xiaoxu2050/article/details/82893476

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 1.结构体的定义方式
  • 2.用结构体实现父类,子类模拟HAL层的代码
  • 2.#define宏的高级用法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档