C语言:结构体基础操作

本文详细介绍了C语言中如何创建结构体、按顺序和不按顺序初始化结构体变量,以及使用结构体变量名和指针访问成员。此外,还涵盖了内存对齐的概念、原因以及对齐规则,强调了对齐在提高数据访问效率和跨平台兼容性的重要性。
摘要由CSDN通过智能技术生成

目录

1.结构体的创建:

2.结构体变量的创建和初始化

(1.)按顺序初始化

(2.)不按顺序初始化

3.结构体成员访问

(1.)用结构体变量名访问

(2.)用结构体指针访问

4.结构体中的内存对齐

(1.)怎么对齐

(2.)为什么要对齐


1.结构体的创建:

这里创建一个包含学生姓名和年龄的基础结构体,并创建结构体类型变量boy1,boy2,结构体数组boy,结构体类型的指针p。

struct stu {
	char name[20];
	int age;
}boy1,boy2,*p;


struct stu {
	char name[20];
	int age;
}boy[2];

其中,struct是结构体关键字,stu是结构体类型名,name和age是结构体成员名;

创建结构体时,不会开辟内存;创建结构体变量时才会开辟该结构体类型对应大小的内存空间。

2.结构体变量的创建和初始化

(1.)按顺序初始化
struct stu boy1={"Libai",25};

直接按顺序按类型初始化即可。

(2.)不按顺序初始化
struct stu boy2={.age=14,.name="Dufu"};

需要使用结构体成员访问运算符“.”。

需要注意的是,如果您使用指定初始化的方式,仍可以同时包含按顺序初始化的部分。未被明确指定的后续成员将按照其在结构体中的声明顺序依次接收剩余的初始值。如果所有成员都被明确指定,则不需要也不应该提供额外的初始值。

3.结构体成员访问

(1.)用结构体变量名访问
printf("%d", boy1.age);

同样使用结构体成员访问运算符。

(2.)用结构体指针访问
#include<stdio.h>

struct stu {
	char name[20];
	int age;
}boy1,boy2,*p;

int main()
{
	struct stu boy1 = { "Libai",25 };
	p = &boy1;
	printf("%d\n", boy1.age);
	printf("%d", p->age);
	return 0;
}

运行结果如图所示。

这里要用到指针间接访问运算符“->”。

4.结构体中的内存对齐

(1.)怎么对齐

1. 起始地址对齐:
   - 结构体第一个成员对齐到与结构体变量起始位置偏移量为0的地址处。

2. 成员偏移对齐:
   - 结构体内的每个成员相对于结构体起始地址的偏移量必须是该成员自身大小的整数倍。

3. 默认对齐数:
   - 编译器为结构体成员和整个结构体定义了一个默认的对齐数,通常与处理器的字长或硬件架构有关。例如,许多32位系统上默认对齐数为4字节,而在64位系统上可能为8字节。这个值可以由编译器指定,也可以通过预处理器宏(如#pragma pack)或编译选项来修改。

4. 成员对齐:
   - 实际对齐时,每个成员的对齐数是其自身大小和默认对齐数的较小值。也就是说,即使某个成员的大小大于默认对齐数,它也会按照默认对齐数对齐。

5. 填充:
   - 为了满足上述对齐要求,编译器可能在结构体的相邻成员之间或结构体的尾部添加额外的字节作为填充。这些填充字节没有实际意义。

6. 结构体总大小对齐:
   - 结构体的总大小必须是其内部最宽基本类型成员大小(或特定编译器设定的最大对齐数)的整数倍。这意味着即使所有成员都已经对齐,如果结构体的自然大小不符合这个要求,编译器会在末尾添加足够的填充字节以达到正确的总大小对齐。

7. 嵌套结构体对齐:
   - 如果结构体中嵌套了其他结构体或联合体,嵌套结构体或联合体本身会先按照自身的对齐规则对齐,然后作为一个整体参与外部结构体的对齐计算。

(2.)为什么要对齐

C语言中的结构体内存对齐规则是为了提高数据访问效率和兼容不同硬件平台的要求而设计的一系列准则。这些规则的目的是确保数据在内存中存储时能够高效地被CPU访问。

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值