前言
作为一个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