1.1 struct 结构体 基础

本文深入探讨了C语言中结构体的定义、大小计算、成员访问、结构体指针和数组,以及如何通过sizeof()函数获取结构体大小。同时介绍了结构体动态内存分配的方法,包括使用malloc()函数为结构体数组分配内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

例: 
struct horse{
	int age;
	int height;
    }Slver;

horse 不是一个变量,通常称为 结构标记符,命名方式与变量名相同。
注: 结构标记符可以和变量使用相同的名称(但最好不要这么做)。


结构体大小
使用 sizeof() 运算符,
1:
struct person
{
    int age;
    int height;
    char name[20];
    char sex;		//
    char father[20];
    char mother[20];
}p1,p2;
sizeof(p1);   //=72    (4 + 4 + 20 + 4 + 20 + 20);
2:
struct person
{
    int age;
    int height;
    char name[20];	//
    char father[20];
    char mother[20];
}p1,p2;
sizeof(p1);   //=68    (4 + 4 + 20 + 20 + 20);
3:
struct person
{
    int age;
    int height;
    char name[18];	//
    char father[20];
    char mother[20];
}p1,p2;
sizeof(p1);   //=68    (4 + 4 + 20 + 20 + 20);
4:
struct person
{
    int age;
    int height;
    char name[16];	//
    char father[20];
    char mother[20];
}p1,p2;
sizeof(p1);   //=64    (4 + 4 + 16 + 20 + 20);
5:
struct person
{
    int age;
    int height;
    char name[18];
    char sex;		//
    char father[20];
    char mother[20];
}p1,p2;
sizeof(p1);   //=68    (4 + 4 + 20 + 20 + 20);

说明: 
访问结构体成员
声明结构体变量: struct person pp;


注: 结构变量的名称不是一个指针。
使用点(.)引用结构成员。例: p1.age = 23;
称为: 成员选择运算符。


结构体指针
声明结构体指针: struct person *pt;

使用 -> 访问结构成员。例: pt->age; 或者 (*pt).age;
称为: 成员指针运算符


结构体数组
声明结构体数组: struct person arr[3];
arr[0].agr = 23;

结构体动态分配内存
struct person *persons[10];
声明了一个包含 五十个指向person结构的指针的数组。
使用 malloc() 函数分配内存空间
<think>好的,我现在需要回答用户关于结构体和共用体区别的问题。首先,我得回忆一下C语言中这两种数据类型的定义和特点。 结构体struct,应该是由多个不同数据类型的成员组成的复合数据类型。每个成员都有独立的内存空间,所以结构体的大小是所有成员大小的总和,可能还要考虑内存对齐的问题。例如,如果有int和char两个成员,结构体的总大小就是int的大小加上char的大小,再加上可能的填充字节。 共用体,union,也是多个不同数据类型的成员组成,但所有成员共享同一块内存空间。这意味着共用体的大小由最大的成员决定,任何时候只能存储其中一个成员的值。修改一个成员会影响其他成员的值,因为它们共用同一块内存。 接下来,我需要整理它们的区别点。内存分配方式不同,结构体是各成员独立存储,共用体是共享存储。内存占用方面,结构体总大小更大,共用体则是最大成员的大小。访问成员时,结构体可以同时访问所有成员,而共用体同一时间只能使用其中一个成员。数据保存方面,结构体所有成员的数据都保存,共用体只能保存最后一次赋值的成员数据。应用场景上,结构体适合需要同时保存多个相关数据的场景,比如学生信息;共用体适合需要节省内存或同一时间只使用一种数据的情况,比如协议中的不同数据格式。 然后,我需要举例子来具体说明。比如结构体的例子可以包含姓名、年龄、成绩,而共用体的例子可能是一个数据包可以存储不同类型的数据。同时,要注意语法上的差异,比如struct和union的关键字使用,以及访问成员的方式都是使用点运算符。 还要注意可能的内存对齐对结构体大小的影响,以及共用体在使用时的注意事项,比如同时访问不同成员可能导致的数据覆盖问题。这些都需要在解释中提及,帮助用户全面理解两者的区别和应用场景。 最后,要确保回答结构清晰,分点列出不同之处,并用例子辅助说明,让用户能够逐步理解结构体和共用体的差异。同时,检查是否有遗漏的重要点,比如初始化、赋值、传参等方面的不同,但可能这些属于更深入的内容,用户问题可能更关注基础区别,所以暂时先不展开,保持回答简洁明了。</think>结构体struct)与共用体(union)是C语言中两种复合数据类型,主要区别如下: --- ### 一、**内存分配方式** 1. **结构体** - 每个成员拥有独立的内存空间。 - 结构体总内存 = 各成员内存之和 + 内存对齐的填充字节。 - 例如: ```c struct Student { char name[20]; // 占用20字节 int age; // 占用4字节 float score; // 占用4字节 }; // 总大小可能为28字节(考虑对齐) ``` 2. **共用体** - 所有成员共享同一块内存空间。 - 共用体总内存 = 最大成员的内存大小。 - 例如: ```c union Data { int i; // 占用4字节 float f; // 占用4字节 char str[10]; // 占用10字节 }; // 总大小为10字节 ``` --- ### 二、**数据存储特性** 1. **结构体** - 所有成员可同时存储不同值,互不影响。 - 适合需要同时保存多个关联数据的场景(如学生信息)。 2. **共用体** - 同一时间只能存储一个成员的值,修改一个成员会覆盖其他成员。 - 适合需要节省内存或同一时间仅需一种数据类型的场景(如协议解析)。 --- ### 三、**语法与使用差异** - **定义方式** ```c // 结构体定义 struct Point { int x; int y; }; // 共用体定义 union Value { int num; char ch; }; ``` - **访问成员** 两者均使用 `.` 运算符,但共用体会因内存共享导致数据覆盖: ```c union Value v; v.num = 65; // 存储整数65 printf("%c", v.ch); // 输出字符'A'(ASCII 65) ``` --- ### 四、**典型应用场景** 1. **结构体** - 描述复杂对象的多个属性(如坐标点、学生档案)。 - 需要同时保留所有成员数据的场景。 2. **共用体** - 节省内存的嵌入式系统开发。 - 解析不同格式的数据包(如网络协议)。 - 实现多态性(同一内存可解释为不同类型)。 --- ### 五、**总结对比表** | 特性 | 结构体struct) | 共用体(union) | |--------------------|----------------------------|----------------------------| | **内存占用** | 所有成员内存之和 + 对齐填充 | 最大成员的内存大小 | | **数据存储** | 所有成员独立存储 | 同一时间仅存储一个成员 | | **修改成员影响** | 不影响其他成员 | 覆盖其他成员数据 | | **适用场景** | 需同时保存多个数据 | 需节省内存或单数据多类型 | --- 通过理解内存分配和存储特性,可以根据实际需求选择合适的数据类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值