【C语言笔记结构体】
我们都知道C语言中变量的类型决定了变量存储占用的空间。当我们要使用一个变量保存年龄时可以将其声明为int类型当我们要使用一个变量保存某一科目的考试成绩时可以将其声明为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语言的数据类型如下图结构体变量的定义方法方法一:// 创建结构体模板struct student struct student{ char *name; // 学生名字 int num; // 学生学号 int age; // 学生年龄 }; // 使用该结构体模板创建三个变量stu1, stu2, stu3 struct student stu1, stu2, stu3;此处student是结构体名该名字是由任意定义的但是尽量起个有意义的名称。其相当于一个模板可以使用这个模板去定义变量stu1stu2stu3。定义的时候不要忘了struct。方法二:// 定义三个结构体变量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的介绍移步至#define与typedef的区别进行查看。使用typedef给结构体创建一个别名这在实际编程用使用非常广泛如STM32单片机固件库中使用得很多如下图初始化结构初始化变量和数组如下int count 0; int arr[7] {0,1,2,3,4,5,6};结构体变量是否也可以这样初始化是的可以。与初始化数组的语法类似struct student stu1 { ZhengNianJun, // 名字正念君 520, // 学号520 23 // 年龄23 };简而言之我们使用在一对花括号中括起来的初始化列表进行初始化各初始化项用逗号分隔。为了让初始化项与结构中各成员的关联更加明显我们让每个成员的初始化项独占一行。这样做只是为了提高代码的可读性对编译器而言只需要用逗号分隔各成员的初始化项即可。C99和C11为结构提供了指定初始化器designated initializer。其初始化器使用点运算符和成员名。例如只初始化student结构中的name成员可以这样做struct student stu1 { .name ZhengNianJun };也可以按照任意顺序使用指定初始化器struct student stu1 { .age 24, .num 520, .name ZhengNianJun };另外对特定成员的最后一次赋值才是它实际获得的值。例如考虑如下代码struct student stu1 { .num 520, .name ZhengNianJun 1314 };此时赋给num的值应该是1314因为它在结构声明中紧跟在name成员之后。新值1314取代了之前的520。指定初始化器在实际编程中也很常用到。如在linux2.6.32.2源码的usb驱动中路径为linux-2.6.32.2\drivers\usb\storage\usb.c有如下代码访问结构体成员结构体成员的访问需要借助结构体成员运算符——点.。如student stu1; // 定义一个结构体变量stu1 stu1.name ZhengNianJun; // 给stu1的成员name赋值 stu1.num 520; // 给stu1的成员num赋值 stu1.age 23; // 给stu1的成员age赋值实例#include stdio.h typedef struct student { char *name; // 学生名字 int num; // 学生学号 int age; // 学生年龄 }student; int main(void) { student stu1; // 定义一个结构体变量stu1 /* 给结构体变量stu1的成员进行赋值 */ stu1.name ZhengNianJun; stu1.num 520; stu1.age 23; printf(\n\n); printf(My name is %s\n, stu1.name); printf(My num is %d\n, stu1.num); printf(My age is %d\n, stu1.age); printf(欢迎关注正念君编程学习笔记\n, stu1.age); printf(\n); return 0; }程序运行结果为结构体是一块很重要的内容用得很多。关于结构体的内存对齐可查看往期笔记【C语言笔记】结构体内存对齐问题以上就是关于结构体的一些笔记如有错误欢迎指出。谢谢欢迎微信扫描左侧二维码或者在微信搜索zhengnian-2018关注我的微信公众号查看更多编程学习笔记原文链接https://blog.csdn.net/zhengnianli/article/details/87568902