一. 结构体
结构体是一种自定义数据类型。
结构体在声明是不开辟内存空间,在定义时才开辟内存空间。
结构体运算符:.:结构体成员运算符,左侧是一个结构体变量。
->:结构体成员运算符,左侧是一个结构体指针。
注意:在对结构体中的name[20]进行赋值时,不能使用=赋值,而应该使用strcpy函数。
cpp
struct per{
char name[20];
int age;
float height;
char phone[20];
};//声明结构体类型,不会开辟内存空间
int main(int argc, char **argv)
{
struct per per1 = {"zhangsan", 20, 175.5, "110"};//定义结构体类型,会开辟空间
struct per per2 = {.name = "lisi", .height = 180.5};//gcc支持的语法
printf("name:%s,age:%d,height:%.2f,phone:%s\n",per1.name,per1.age,per1.height,per1.phone);
printf("name:%s,height:%.2f\n",per2.name,per2.height);//.:结构体成员运算符
strcpy(per2.name, "wangmazi");//这里是一个字符类型的数组,不可使用=赋值,必须使用strcpy函数进行赋值
per2.age = 18;
per2.height = 170.0;
strcpy(per2.phone,"120");
printf("name:%s,age:%d,height:%.2f,phone:%s\n",per2.name,per2.age,per2.height,per2.phone);
struct per per3;
struct per *pper = &per3;
scanf("%s %d %f %s",per3.name,&per3.age,&per3.height,per3.phone);
printf("name:%s,age:%d,height:%.2f,phone:%s\n",per3.name,per3.age,per3.height,per3.phone);
printf("name:%s,age:%d,height:%.2f,phone:%s\n",pper->name,pper->age,pper->height,pper->phone);
return 0;
}
二. 结构体的内存对齐
内存对齐的原因:
结构体大小计算规则:
-
第一个成员在与结构体变量偏移量为0的地址处。
-
其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
-
结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
-
如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
cpp
struct per{
char name[20];
int age;
float height;
char phone[20];
};//声明结构体类型,不会开辟内存空间
int main(int argc, char **argv)
{
struct per per1 = {"zhangsan", 20, 175.5, "110"};//定义结构体类型,会开辟空间
struct per per2 = {.name = "lisi", .height = 180.5};//gcc支持的语法
printf("name:%s,age:%d,height:%.2f,phone:%s\n",per1.name,per1.age,per1.height,per1.phone);
printf("name:%s,height:%.2f\n",per2.name,per2.height);//.:结构体成员运算符
strcpy(per2.name, "wangmazi");//这里是一个字符类型的数组,不可使用=赋值,必须使用strcpy函数进行赋值
per2.age = 18;
per2.height = 170.0;
strcpy(per2.phone,"120");
printf("name:%s,age:%d,height:%.2f,phone:%s\n",per2.name,per2.age,per2.height,per2.phone);
struct per per3;
struct per *pper = &per3;
scanf("%s %d %f %s",per3.name,&per3.age,&per3.height,per3.phone);
printf("name:%s,age:%d,height:%.2f,phone:%s\n",per3.name,per3.age,per3.height,per3.phone);
printf("name:%s,age:%d,height:%.2f,phone:%s\n",pper->name,pper->age,pper->height,pper->phone);
return 0;
}