C语言 -- 结构体的基本使用和内存分析

tech2025-08-04  7

/* 可以由多个不同类型的数据构成,可结合数组分析 */ //1.定义结构体类型(并不会分配存储空间,系统不会为类型分配控件,比如 int,只会为 int 类型的数据分配控件) struct Person { //结构体的成员或属性 int age;//4个字节 double height;//8 个字节 char *name;//指针 8 个字节 }; //2.根据结构体类型,定义结构体变量(真正分配存储空间,默认情况下,一个结构体变量,比如 p1 所占用的存储空间就是它所有成员的和) struct Person p1 = {20, 1.66, "jack"};//p 为结构体的变量名 struct Person p2 = {23, 1.68, "jack2"}; //输出结果为:age = 20, height = 1.660000, name = jack printf("age = %d, height = %f, name = %s\n",p1.age,p1.height,p1.name); /* 输出结果为: age = 0x7ffeedd46840, height = 0x7ffeedd46848, name = 0x7ffeedd46850 */ printf("age = %p, height = %p, name = %p\n",&p1.age,&p1.height,&p1.name); p1.age = 30; p1.name = "rose"; //输出结果为:age = 30, height = 1.660000, name = rose printf("age = %d, height = %f, name = %s\n",p1.age, p1.height, p1.name); //会将 p1 所有成员的值对应的赋值给 p2 的所有成员; p2 = p1; //但是 p1 和 p2 在内存中是独立的存储空间,所以修改 p2 结构体内的成员时,只会影响 p2 内部成员的值 p2.name = "lily"; /* 输出结果为: p1 赋值给 p2 后 p1 内部成员的值:age = 30, height = 1.660000, name = rose */ printf("p1 赋值给 p2 后 p1 内部成员的值:age = %d, height = %f, name = %s\n",p1.age, p1.height, p1.name); /* 输出结果为: p1 赋值给 p2 后 p2 内部成员的值:age = 30, height = 1.660000, name = lily */ printf("p1 赋值给 p2 后 p2 内部成员的值:age = %d, height = %f, name = %s\n",p2.age, p2.height, p2.name); //错误写法: 因为结构体名代表地址,结构体的地址不可以随便改,相当于一个常量 //struct Person p4; //p4 = {22, 1.67,"jack"}; //只能在定义结构体的时候一次性赋值或者点语法赋值 //顺序赋值 struct Person p5 = {22, 1.67,"jack"}; //自定义顺序赋值 struct Person p6 = {.height = 1.78, .name = "jim", .age = 26 }; /* 输出结果为:24 补齐算法(对齐算法) 结构体所占用的存储空间,必须是最大成员字节数的倍数 */ int size = sizeof(p1); printf("p1 的 size = %d\n",size);
最新回复(0)