自定义结构体类型及内存分布
1、结构体:结构体是一些值得集合,这些值成为成员变量,成员的每个变量可以是不同的类型,例如标量,指针,数组,其他的结构体.
2、结构体定义,创建变量及初始化
struct Peo_data {
char name[10];
int age;
}data = {"zhangsan",5};
//struct Peo_data data = {"zhangsan",5};
struct为结构体的关键字,Peo_data,是我们为这个结构体起的名字。里面的成员包含一个数组,和一个整形变量。
在定义结构体时我们可以直接创建一个变量,也可以在使用的时候创建一个变量。相对应我们可以将它初始化
3、结构体变量访问
(1)结构体变量访问成员,使用点操作符进行访问(.)
struct Peo_data {
char name[10];
int age;
}data;
int main()
{
//在内存中给变量data创建一块
struct Peo_data data = {"zhangsan",5};
//变量data有俩个成员,将它们分别打印
printf("%s\n",data.name);
printf("%d\n",data.age);
return 0;
}
(2)结构体指针访问成员
//声明定义一个结构体类型
struct Next_Peo
{
char name[10];
int age;
};
//因为传过来的形式参数是一个struct Next_Peo结构体类型
//相对应实参要用一个结构体指针接收
void print(struct Next_Peo* p)
{
//p是一个指针变量,指向data变量的地址,先对p进行解引用
//p现在就可以访问data变量下的所有成员,再用“.”操作符一一访问
//p是一个指针变量,指向data变量的地址,它也可以直接访问地址下的成员
printf("%s\n",(*p).name);
printf("%d\n",(*p).age);
printf("%s\n",p->name);
printf("%d\n",p->age);
}
int main()
{
//创建变量
struct Next_Peo data = {"zhangsan",5};
//地址传参打印变量成员
print(&data);
return 0;
}
4、结构体在内存的分布
(1)了解结构体在内存的分布,我们先了解一个概念,编译器为结构的每一个成员按照它的自然边界分配空间,各个成员按照它们声明的顺序在内存中存储,第一个成员的地址也是整个结构的地址。
每个编译器会根据自己电脑设置自己的对齐数,在VS的编译器下对起数为4.为什么编译器在存储结构的时候要按照自然边界来分配空间呢?打个比方:我们的电脑是32位系统,一次访问内存的字节数位4字节,按照对齐数4来读取数据的话就能够更高效的操作。
下面展示一些 内联代码片
。
//声明定义一个结构体类型
struct Next_Peo
{
char name[10];//10
float a;//4
int age;//4
};
int main()
{
printf("%d\n",sizeof(struct Next_Peo));
return 0;
}
该结构在内存中占字节大小20
声明定义结构体类型
红色代表数组name[10]最后字节地址偏移量为10,接下来a变量要存储的话按照编译器的对齐数来的话,要是4的倍数,就要舍去2个字节的内存存储a,a的最后偏移量为16,为对齐数的整数倍,可以接着存放age,age的最后的偏移量为20为对齐数的整数倍,所以该结构占内存20字节。
(2)
struct Peo_Info
{
char name[10];
int age;
struct Peo_Info* next;
}data;
int main()
{
printf("%d\n",sizeof(struct Peo_Info));
return 0;
}
结果是20个字节。注意:结构体指针,存放一个地址要么4个字节或者8个字节。根据上面的分析进行计算