知识点:
1)结构体的定义。
2)结构体的sizeof。
3) 结构体的指针。
1) 结构体的定义:
在逻辑上有一定关联的多个数据类型做为一整体进行操作的数据结构,它的关键字是struct。下面我将定义一个结构体
struct Student{
char *name;
int age;
int sid;
};
我用上面定义的结构体Student来定义一个变量。
struct Student student;
上面的代码有点烦,其实我可以这样写
struct Student{
char *name;
int age;
int sid;
} student;
或者有typedef来给它定义一个别名
typedef struct Student{
char *name;
int age;
int sid;
} Student;
Student student;
现在我已经定义了一个student结构体变量,下面将对它赋值:
student={"lishi",23,1001};
当然我也可以用点号去给它里面的成员赋值:
student.name="lishi";student.age=23;student.sid=1001;
2) 结构体的sizeof。
上面我定义的结构体Student 在64位的机器上占用多少个字节了,是不是所有成员所占用的字节数之和了,答案肯定不是的,当然也有巧合了,如果里面成员都是同类型的数据。它的大小应该大于等于所有成员之和。这里涉及到一个内存对齐的概念,这里就不细说这个。当我们定义一个结构体是,它的默认对齐模型大小是它成员之中占用字节最多的类型, 比如上面的Student之中,字符指针占用的字节数最多,是8个字节。所以Student占用的字节数是8的整数倍。然而有人会问,我们可以改变这个默认对齐大小?当然可以,我们可以通过 #pragma pack(N)告之编译器,我们要指定对齐大小,其中N 是2的指数。这里得指出,不是你想把它改成多大就多大,如果N大于结构体中占用字a节最多的类型,对齐大小将是占用字节最多的类型。我总结下面几点
a.结构体总大小必须是“对齐大小”的整数倍
b.每个成员的起始地址必须是"自身对齐大小的"整数倍
c.对齐大小由 自身类型和最大成员类型和pack(N)决定
d.N是2的指数
这里要注意一点,比如我在结构体里定义了一个数组,对齐大小是不是等于这个数组的大小,当然不是,这个只跟数组的类型有关。
3) 结构体的指针。
下面我将定义一个结构体指针,假设我们已经给它定义了一个别名Student.
Student *std;
这样我就可以通过->运算符去访问它的成员了,例如:std->name="lishi";
还有一点要注意一下,结构变量可以赋值为另外一个结构变量,变量名只是相当于给申请的内存空间定义了一个名字,就相当于int类型定义变量一样,不想数组名是指向它的第一个元素的地址。