这题目好大。。。我就说三点吧:
结构体的定义和结构体变量的声明
一个结构体的完整定义是这样的:
- struct Student {
- char name[20];
- int id;
- int score;
- } stu1
复制代码
结构体以关键字struct开头,跟上结构体名称Student(可省略,如果省略,则结构体成员列表后必须跟上要声明的结构体变量,否则就永远无法再声明这个结构体类型的变量了),后接一对大括号,大括号内声明结构体成员(数组要求元素只能是同一类型,而结构体的成员可以是任何类型),最后是该结构体类型的变量列表(可省略,如果省略,则结构体名称不能省略)。
通常,定义结构体时暂不声明结构体类型的变量:
- struct Student {
- char name[20];
- int id;
- int score;
- }
复制代码
等使用时再声明结构体变量,格式为:
- struct Student stu1; // 声明一个叫Student的结构体类型变量stu1
复制代码
声明结构体变量必须以struct开头,不能只写为Student XXX,因为Student不是一种数据类型。
每次声明变量都写 struct Student比较麻烦,可以借助typedef简化书写:
- typedef struct {
- char name[20];
- int id;
- int score;
- } Student
复制代码
经过typedef后,Student就不是结构体名称,而真正成为一种数据类型了,之后声明变量只需要:
内存结构
结构体和数组一样,在内存中占据一块连续的内存空间。如果不考虑内存对齐的要求,结构体占据的内存空间就等于各成员占据的字节数之和,比如Student占据28字节的内存。
结构体成员的访问
假定已经用typedef声明了一个结构体类型Student的变量stu,要访问其成员,可以用点运算符(.)
- stu.name = "Jack";
- stu.id = 1;
- stu.score = 90;
复制代码
由于结构体一般包含多个成员,占据内存空间较大,为节约资源,通常对结构体的操作是通过定义指向结构体的指针来完成的(OC对象底层就是结构体,因此操作OC对象都用指针),当使用指针访问结构体变量时,要用运算符 ->:
- Student *stu1 = (Student)malloc(sizeof(Student));
- stu1 -> id = 1;
复制代码
|