7指针1
指针变量也是变量
1. 初识:结构体
可以通过 C 语言里面的工具来描述这种类型的特点,这个可以用来描述和定义新类型的工具,就叫做:结构体。
struct point {
// 描述这个类型的组成部分
};
struct point,也就是结构体点类
struct point p1, p2;
通过点类来定义对象
struct point {
int x, y;
};
在这个过程中,有没有一种盖房子的感觉?先有地基,再盖一楼,然后是二楼。也就是在程序中,先有基础数据类型,然后是基于这些基础数据类型,定义出新的数据类型。
让 p1 代表点 (2, 3),让 p2 代表点 (7, 9),代码如下:
p1.x = 2;
p1.y = 3;
p2.x = 7;
p2.y = 9;
点“.”运算符,这个也叫做“直接引用”运算符,p1.x,意思是 p1 变量里面的 x 字段。
2. 结构体变量的大小
struct point p;
sizeof(p);
sizeof(struct point);
这两种使用 sizeof 方法的代码均能正确的告诉你一个 struct point 类型的变量占用的存储空间大小。
Data1 结构体,只包含一个整型和两个字符型字段,所占用的空间大小应该是 4+1+1=6 个字节啊,怎么变成了 8 个字节?
Data2 结构体,和 Data1 结构体包含字段种类都是一样的,那既然 Data1 是 8 个字节,为什么 Data2 是 12 个字节呢?
对于某个结构体类型而言,其存储单元大小,等于它当中占用空间最大的基础类型所占用的字节数量。
对于 Data1 结构体类型来说,整型是其当中占用空间最大的基础类型,它的一个存储单元的大小,就是 4 个字节,等于它当中整型字段所占用的字节数量。也就是说,Data1 这个结构体类型,要不就占用 1 个存储单元,即 4 个字节的空间,要不然就占用 2 个存储单元,即 8 个字节的存储空间,不会出现 6 个字节的情况。
结构体的字段在内存中存储的顺序,是按照结构体定义时的顺序排布的,而且当本存储单元不够安放的时候,就从下个存储单元的头部开始安放。
在设计结构体的时候,不仅要设计新的结构体类型中所包含的数据字段,还需要关注各个字段之间的顺序排布。
3. 指针变量也是变量
指针是变量,指针是一种用来存储地址的变量!
int a = 123, *p = &a;
printf("%d %p %d\n", a, p, *p);
p 变量中存储的就是 a 变量的首地址,也就是说,我们可以通过 p 变量中所存储的信息。
小结
- 结构体是用来创造新类型的利器,而结构体类型所占存储空间大小,与其内部字段的组成和各个字段的顺序排布均有关。
- 指针变量也是变量,这是一种存储地址信息的变量。