C语言基础之结构体讲解
程序员文章站
2022-06-27 22:41:01
结构体
结构体是一种数据结构。 int 、float等是基本数据结构。 数组也是一种数据结构,但是数组存放的数据类型比较单一,结构体解决了数组里不能存放多种类型数据的这种缺陷。...
结构体
结构体是一种数据结构。 int 、float等是基本数据结构。 数组也是一种数据结构,但是数组存放的数据类型比较单一,结构体解决了数组里不能存放多种类型数据的这种缺陷。
1、结构体的声名声名时,不占空间,只是声名了一种数据类型,定义时才分配空间
// struct声名结构体是必须有,infor是该种结构体的类型名,可自定义。 struct infor { char a[10]; float b; int c; };2、结构体的变量定义
struct infor stu; //定义时也要有struct。 struct infor2 { char a[5]; float b; int c; }a, b[3], *c; //可以在声明的同时定义变量。 //声名结构体时没有名字,声名之后无法调用,只能声名的同时定义变量,但编译时不会报错。 struct { int a; float b; char c; }s; //可以用typedef重命名类型以方便定义变量 //在声明时使用typdef,不写变量名也可使用 typedef struct { int a; float b; char c; }S, *p_S; //S是该类型结构体的新类型名,p_S是指向该类型变量的指针的类型名 S a; p_S p;3、结构体变量的初始化
struct infor { char a[50]; char b; int c; }; struct infor s1 = {"abc", 1}; //初始化时按成员顺序赋值,不完全初始化时补0. //a[0] = 'a', a[1] = 'b', a[2] = 'c', 其余为0; struct infor s2 = {.a="qew", .b=15}; //单独初始化 struct infor s3 = {.a=27, .a="qew"}; //单独初始化时,后者可以将前者覆盖。 struct infor *p_s = &s1;4、结构体成员的赋值及调用
普通结构体变量取成员用 ‘.’ 运算符。 结构体指针取成员需要用 ‘->’ 运算符(类似于解引用)。
struct infor { char a[50]; char b; int c; }; struct infor s1 = {"abc", 1}; struct infor s2 = {.a=27, .a="qew"}; struct infor *p_s = &s1; //初始化之后赋值就必须对成员单独一一赋值了。 s1.b = 18; p_stu -> c = 16;5、结构体的内存对齐原则
结构体的起始地址默认为4的整数倍,当结构体内 占内存最多的成员 所占字节数size小于4时,起始地址为size的整数倍
即结构体内占内存最大的成员是short时,
起始地址为2的整数倍(2<4,所以取2)。 结构体内占内存最大的成员是double时,
起始地址为4的整数倍(8>4,所以取默认值4)。 各成员的首地址均为自身所占内存的整数倍,所以就有了内存补齐原则
struct str1 // 7个字节有效数据 { int a; // 4,int类型从地址是4的倍数处开始存储 char b; // 1 // 1 填充了1字节空间 short c; // 2,short类型从地址是2的倍数处开始存储 }s1; // 8 struct str2 { char a; // 1 char b; // 1 // + 2 填充了2字节空间 int c; // 4 }s2; // 8 struct str3 // 6 { int a; char b; char c; // + 2 填充了2字节空间 }s3; // 8 struct str4 // 10 { struct str1 s; // 8 char a; // 1 + 3 填充了3字节空间,因为struct str1中有int类型,所以要补齐4个字节。 }s4; // 12 struct str5 // 10 { short a[4]; // 8 char b; // 1 + 1 填充了1字节空间 }s4; // 10