c语言中数据结构

一、结构体的由来

1. 数据类型的不足

C语言中,基本数据类型只有整型、字符型、浮点型等少数几种,无法满足复杂数据类型的需要。

2. 数组的限制

虽然数组可以存储多个同类型的数据,但是数组中的元素个数是固定的,无法动态地改变大小。

3. 指针的局限性

指针只能指向一个变量,无法同时指向多个变量。

为了解决以上问题,C语言引入了结构体(struct)这一复合数据类型。结构体是由一组不同类型的变量组成的集合,可以方便地表示复杂的数据结构。

二、结构体的使用方法

1. 定义结构体类型

使用关键字struct和大括号{}来定义结构体类型,其中包含若干个成员变量。例如:

c 复制代码
struct Student {
    char name[20];
    int age;
    float score;
};

上述代码定义了一个名为Student的结构体类型,它包含三个成员变量:name(字符串类型)、age(整型)和score(浮点型)。

2. 声明结构体变量

声明结构体变量时,需要指定其类型为已定义的结构体类型。例如:

c 复制代码
struct Student stu1, stu2;

上述代码声明了两个Student类型的结构体变量stu1和stu2。

3. 访问结构体成员变量

通过"."运算符来访问结构体变量中的成员变量。例如:

c 复制代码
strcpy(stu1.name, "Tom");
stu1.age = 18;
stu1.score = 90.5;

上述代码分别给stu1的name、age和score成员变量赋值。

三、结构体在计算机中的存储方式

1. 内存对齐

为了提高内存读写效率,编译器会对结构体进行内存对齐。内存对齐是指将结构体中的成员变量按照一定的规则排列在内存中,使得它们的地址都是某个特定值的倍数。例如,对于一个int类型的变量,它的地址必须是4的倍数;对于一个char类型的变量,它的地址必须是1的倍数。如果某个成员变量按照默认对齐方式排列后,其地址不是某个特定值的倍数,编译器会在其前面填充一些空白字节,使其地址变为某个特定值的倍数。例如:

c 复制代码
struct Student {
    char name[20]; // 地址为0x00000000,不需要对齐
    int age;       // 地址为0x00000004,需要对齐,填充2个空白字节(即地址为0x00000004)
    float score;   // 地址为0x00000008,需要对齐,填充3个空白字节(即地址为0x00000008)
};

2. 结构体的大小计算

结构体的大小等于其所有成员变量的大小之和。如果成员变量之间有空白字节,那么这些空白字节也会被计算在内。例如:

c 复制代码
struct Student {
    char name[20]; // 占用20个字节(包括末尾的'\0')
    int age;       // 占用4个字节(假设为int类型)
    float score;   // 占用4个字节(假设为float类型)
};

上述代码中,Student结构体的大小为24个字节(20+4+4=28),因为name数组后面有3个空白字节(即sizeof(name)=23)。需要注意的是,不同的编译器可能会对结构体的内存对齐方式和大小计算方法有所不同。因此,在编写程序时应该尽量避免依赖于具体的内存布局细节。

相关推荐
4311媒体网23 分钟前
C语言操作符全解析 C语言操作符详解
java·c语言·jvm
二年级程序员37 分钟前
一篇文章掌握“顺序表”
c语言·数据结构
傻乐u兔2 小时前
C语言进阶————指针4
c语言·开发语言
历程里程碑2 小时前
Linux22 文件系统
linux·运维·c语言·开发语言·数据结构·c++·算法
2601_949146539 小时前
C语言语音通知接口接入教程:如何使用C语言直接调用语音预警API
c语言·开发语言
中二病码农不会遇见C++学姐10 小时前
包管理器:从“依赖地狱”到“软件宇宙”的演化史
其他
知南x11 小时前
【Ascend C系列课程(高级)】(1) 算子调试+调优
c语言·开发语言
2的n次方_13 小时前
Runtime 执行提交机制:NPU 硬件队列的管理与任务原子化下发
c语言·开发语言
凡人叶枫13 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
凡人叶枫15 小时前
C++中输入、输出和文件操作详解(Linux实战版)| 从基础到项目落地,避坑指南
linux·服务器·c语言·开发语言·c++