>点击蓝字,关注我们
往
期
回
顾
指针是C语言的灵魂:一篇文章带你掌握指针的基本概念和用法
C语言的数组:跨越一个阶梯,如何用一种数据结构存储无限多的数据?
01
本节重点
C语言结构体
结构体的概念
结构体是C语言中一种复合数据类型,它可以将不同类型的数据组合成一个整体,称为结构体变量。结构体变量中的每个数据称为结构体成员,它们可以是基本数据类型,也可以是数组,指针,甚至是其他结构体类型。结构体可以用来表示一些复杂的数据结构,如学生信息,图书信息,链表,树等。
结构体的类型
结构体的类型由结构体名和结构体成员列表组成,使用关键字struct来定义。结构体名可以自由命名,但要避免与已有的变量名或类型名冲突。结构体成员列表由一对大括号包围,每个成员占一行,以分号结束。结构体类型的定义格式如下:
例如,定义一个表示学生信息的结构体类型,可以写成:
struct student
{
char name[20]; //姓名
int id; //学号
int age; //年龄
char gender; //性别
float score; //成绩
};
结构体的格式
结构体的格式指的是结构体变量在内存中的存储方式。结构体变量的大小等于所有成员的大小之和,但是由于编译器的对齐规则,结构体变量的实际占用的空间可能会比这个值大一些。结构体变量的地址等于第一个成员的地址,结构体成员的地址按照它们在结构体中的顺序依次排列,每个成员的地址都是它的大小的整数倍。
例如,上面定义的student结构体类型,在32位系统中,每个成员的大小分别为20,4,4,1,4字节,如果按照它们的大小之和,那么结构体变量的大小应该是33字节,但是由于编译器的对齐规则,实际上结构体变量的大小是36字节,因为gender成员的地址要求是4的整数倍,所以在gender前面要补齐3个字节的空白,这样才能保证结构体成员的地址都是它的大小的整数倍。
结构体的用法
结构体的用法主要包括以下几个方面:
- 定义结构体变量
- 访问结构体成员
- 初始化结构体变量
- 复制结构体变量
- 传递结构体变量
- 指向结构体的指针
定义结构体变量
定义结构体变量有两种方式,一种是在定义结构体类型的同时定义变量,另一种是先定义结构体类型,再用结构体类型定义变量。两种方式的区别在于,前者只能定义一次,后者可以多次定义。定义结构体变量的格式如下:
例如,定义一个表示图书信息的结构体变量,可以写成:
//方式一struct book { char title[50]; //书名 char author[20]; //作者 float price; //价格} b1; //定义一个book类型的变量b1
//方式二struct book { char title[50]; //书名 char author[20]; //作者 float price; //价格};struct book b2; //定义一个book类型的变量b2访问结构体成员
访问结构体成员的方法是使用点运算符(.),点运算符的左边是结构体变量的名字,右边是结构体成员的名字。访问结构体成员的格式如下:
通过这种方式,可以获取结构体成员的值,也可以给结构体成员赋值。例如,给b1和b2的成员赋值,并打印它们的值,可以写成:
#include <stdio.h>#include <string.h> //引入字符串处理函数的头文件//定义结构体类型struct book{ char title[50]; //书名 char author[20]; //作者 float price; //价格};int main(){ struct book b1; //定义一个book类型的变量b1 struct book b2; //定义一个book类型的变量b2 //给结构体成员赋值 strcpy(b1.title, "C语言程序设计"); //用strcpy函数复制字符串 strcpy(b1.author, "谭浩强"); b1.price = 39.8f; //用单精度浮点数赋值 strcpy(b2.title, "数据结构与算法分析"); strcpy(b2.author, "Mark Allen Weiss"); b2.price = 49.9f; //打印结构体成员的值 printf("b1的书名是%s,作者是%s,价格是%.2f元\n", b1.title, b1.author, b1.price); printf("b2的书名是%s,作者是%s,价格是%.2f元\n", b2.title, b2.author, b2.price); return 0;}测试程序:
(内容太多了,下节继续)
想要学习C语言的朋友可以自己购买下面推荐的c语言基础从入门到精通,内容包含c语言初始到最终实战,附赠视频教学,让你轻松学习C语言。
点赞加关注,学习不迷路
微信公众号|工控小新
EPLAN电气绘图、TIA博图基础 、CAD、C语言教学、单片机基础、三菱PLC ... 每日持续更新中
发现“分享”和“赞”了吗,戳我看看吧
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |