[014]C语言

2020-06-08 10:47:01 浏览数 (1)

前言

作为一个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 morninn");
}

void work() {
    printf("I am workingn");
}

void cook() {
    printf("I am cookingn");
}

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

0 人点赞