先上冷菜:复习结构体样式
type A:
多年工作经验告诉我这种方法最为标准实用,墙裂推荐
typedef struct Student
{
int a;
}Stu;
使用方法:
Stu exam;
type B:
省略了struct后面的内容
typedef struct
{
int a;
}Stu;
使用方法:
Stu exam;
type C:
省略了最后分号前的定义
typedef struct stu
{
int a;
};
使用方法:
struct Student exam;
注意:这种方法编译器可能会警告,但是能够运行且正常读取数据不发生段错误。
type D:不使用typedef的情况
typedef可以自定义化名称,不使用它相当于直接操作原生的结构体。
1.将typeA中的typedef去掉,此时Stu已经没意义了,注意不可以使用struct Stu exam
struct Student
{
int a;
}Stu;
使用方法:
struct Student exam;
2.将typeB中的typedef去掉
这是直接创建结构体变量的形式,只能使用一次,显然在实战中基本没有什么用处。
struct
{
int a;
}Stu;
3.将typeC中的typedef去掉
百度百科收录了这种写法,也是比较标准的,但是本人不推荐使用
typedef struct stu
{
int a;
};
使用方法:
struct Student exam;
冷菜总结:实际应用上使用TYPE A的场景极其繁多,真心只记住它就行。
热菜来了:
结构体指针
定义:
拿最经典的TYPE A,在分号前面增加了指针
typedef struct Student
{
int a;
}Stu,*pStu;
使用方法
pStu exam1;
Stu exam2;
exam1 = &exam2;//注意有些编译器可以不加&
exam2.a = 1;
printf("%d",exam1->a);//输出为1
也可以不改变TYPE A
使用方法
Stu *exam1;
Stu exam2;
exam1 = &exam2;//注意有些编译器可以不加&
exam2.a = 1;
printf("%d",exam1->a);//输出为1
复杂式结构体TYPE I:内有函数指针
继续拿最经典的TYPE A,加入函数指针
typedef struct Student
{
int a;
void (*fun)(int a);
}Stu;
使用之前先定义一个引用的函数
void foo(int i){
printf("%d",i);
}
Stu exam;
exam.fun = foo;
exam.fun(1);//调用引用的函数,输出1
这个函数指针有点low,来个再复杂的,直接贴图
复杂式结构体TYPE II:内部竟有本身
就是这么神奇,继续拿最经典的TYPE A,加入本身
typedef struct Student
{
int a;
struct Student *stu_exam;
}Stu;
用法:
Stu exam;
Stu child;
child.a = 1;
exam.stu_exam=child;//exam内的“本身”是结构体child
那么怎么读取child中的a元素值?
exam.stu_exam.a?
显然不对,正确的做法是需要一个Stu类型的容器来装child,这是抽象的,实体实现就是定义一个Stu指针指向child
Stu *p;
p = exam.stu_exam;
printf("%d",p->a);//输出a,大功告成
未完待续