为什么会写这篇文章,在看一篇关于内存的博客时,作者搬出了XNU的源码,发现其中有一处关于结构体的定义使用的挺简洁巧妙,顿时觉得应该总结下这块知识,虽然简单,但并不是每个人都能清晰的讲明白。
1、结构体定义:
1.只有结构体的定义
struct People {
char name[20];
char sex;
int age;
};
2、同时创建该结构体变量的定义方式:
struct Student {
char name[20];
char class;
int age;
} student1;
这种方式等价于:
struct Student {
char name[20];
char class;
int age;
};
struct Student student1; //使用struct Student来定义结构体变量
这种写法每次定义结构体变量是都需要通过:
struct Student 结构体变量;
**需要注意:没有struct,只有Student student1是错误的,struct 和 Student共同组成了结构体类型。**
3、使用typedef
typedef struct Student {
char name[20];
char class;
int age;
} XXStudents;
这种方式定义的结构体,在声明结构体变量时,我们只需要使用如下方式:
XXStudents stu1;
没有typedef就需要使用 struct XXStudents stu1;方式。
通过使用typedef以此来声明struct Student这个结构体的别名为:XXStudents。
4、typedef struct tagNode
{
char* pItem;
pNode* pNext;
}pNode;
这种方式定义就会报错,我们分析下:
1、C语言中允许结构体中使用只想自己的指针。
2、这里报错的原因是typedef,使用了typedef后,pNode就是一个别名,在新结构体建立时,发现有一个类型为pNode,但是pNode是表示类型的新名字,在类型本身还没有建立完成的时候,这个类型的新名字也还不存在。
这里也附上修改方式:(下面这种方式为推荐写法:)
struct tagNode {
char* pItem;
struct tagNode* pNext;
};
typedef struct tagNode* pNode;
鉴于这部分都是小的语法知识,排版不是很优雅,大家以内容为主,有问题欢迎指正。
关于typedef的使用,请参阅下篇文章。
网友评论