一、同时定义多个变量
我们都知道C语言中变量的类型决定了变量存储所占用的空间。当我们要使用变量来保存年龄时,可以声明为int类型c语言结构体有什么用,而当我们要使用变量来保存科目的考试成绩时,可以声明为float。
那么,当我们要做一个学生信息管理系统时,需要保存学生的姓名、学号、年龄等信息,我们应该怎么做呢?
例如,当您要保存三个学生的信息时,
方法一是:
char *name1,*name2,*name3; // 三个学生的姓名
int num1,num2,num3; // 三个学生的学号
int age1,age2,age3; // 三个学生的年龄
第二种方法是:
// 创建结构体模板
struct student
{
char *name; // 学生名字
int num; // 学生学号
int age; // 学生年龄
};
// 使用该结构体模板创建三个变量stu1, stu2, stu3
struct student stu1, stu2, stu3;
显然,第二种方法更清晰,因为它将name、num和age集成到一个模板中。当你想使用它时,你只需要应用模板来创建它。这是结构。
二、什么是结构
结构(struct)是由一系列相同类型或不同类型的数据项组成的数据集合。这些数据项称为结构的成员。例如,上面的student结构包含三个成员,分别是name、num和age。
结构是 C 语言中的一种构造。C语言的数据类型如下:
三、结构体变量方法1的定义方法
// 创建结构体模板struct student
struct student
{
char *name; // 学生名字
int num; // 学生学号
int age; // 学生年龄
};
// 使用该结构体模板创建三个变量stu1, stu2, stu3
struct student stu1, stu2, stu3;
这里student为结构名,随意定义,但尽量取一个有意义的名字。相当于一个模板,可以用来定义变量stu1、stu2、stu3。定义时不要忘记结构。
方法二
// 定义三个结构体变量stu1, stu2, stu3
struct
{
char *name; // 学生名字
int num; // 学生学号
int age; // 学生年龄
}stu1, stu2, stu3;
与方法一相比,这里省略了结构名称。虽然更简洁,但是因为没有名字,所以以后不能用这个结构来定义新的变量。
方法三
// 给结构体模板struct student重新命名为student
typedef struct student
{
char *name; // 学生名字
int num; // 学生学号
int age; // 学生年龄
}student;
// 使用student创建三个结构体变量stu1, stu2, stu3
student stu1, stu2, stu3;
这里,typedef 用于为结构模板 struct student 定义一个别名 student。typedef的介绍移到之前的笔记:【C语言笔记】#define和typedef有什么区别?查看。使用typedef为结构体创建别名,在实际编程中被广泛使用,比如STM32单片机固件库,用的比较多,如下图:
四、初始化结构
初始化变量和数组如下:
int count = 0;
int arr[7] = {0,1,2,3,4,5,6};
结构变量也可以这样初始化吗?是的,当然。类似于初始化数组的语法:
struct student stu1 =
{

"ZhengN", // 名字:ZhengN
520, // 学号:520
99 // 年龄:99
};
简而言之,我们使用一对花括号括起来的初始化列表进行初始化c语言结构体有什么用,每个初始化列表用逗号分隔。
为了使初始化器与结构成员的关联更加明显,我们将每个成员的初始化器放在自己的行上。这只是为了提高代码的可读性。对于编译器,只需用逗号分隔每个成员的初始值设定项即可。
C99 和 C11 为结构体提供了指定的初始化器。它的初始化器使用点运算符和成员名称。例如,要仅初始化学生结构的 name 成员,您可以这样做:
struct student stu1 =
{
.name = "ZhengN"
};
指定初始化器也可以按任何顺序使用:
struct student stu1 =
{
.age = 99,
.num = 520,
.name = "ZhengN"
};
此外,对特定成员的最后分配是它实际获得的值。例如,考虑以下代码:
struct student stu1 =
{
.num = 520,
.name = "ZhengN",
1314
};
此时,分配给 num 的值应该是 1314,因为它跟在结构声明中的 name 成员之后。新值 1314 替换了之前的 520。
指定初始化器也常用于实际编程中。比如在linux2.6.32.2源码的usb驱动中(路径为:linux-2.6.32.2driversusbstorageusb.c ),代码如下:
五、访问结构成员
访问结构成员需要结构成员运算符 – 点 (.) 的帮助。喜欢:
student stu1; // 定义一个结构体变量stu1
stu1.name = "ZhengN"; // 给stu1的成员name赋值
stu1.num = 520; // 给stu1的成员num赋值
stu1.age = 99; // 给stu1的成员age赋值
例子
#include
typedef struct student
{
char *name; // 学生名字
int num; // 学生学号
int age; // 学生年龄
}student;
int main(void)
{
student stu1; // 定义一个结构体变量stu1
/* 给结构体变量stu1的成员进行赋值 */
stu1.name = "ZhengN";
stu1.num = 520;
stu1.age = 99;
printf("n============================================n");
printf("My name is %sn", stu1.name);
printf("My num is %dn", stu1.num);
printf("My age is %dn", stu1.age);
printf("欢迎关注公号:嵌入式大杂烩!n", stu1.age);
printf("============================================n");
return 0;
}
运行程序的结果是:
结构是一个非常重要的内容,被大量使用。关于结构体的内存对齐,可以查看之前的笔记:【C语言笔记】C语言结构体内存对齐问题
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 欧资源网