网站首页 > 文章精选 正文
点击蓝字,关注我们
往期回顾
指针是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;
}
测试程序:
点赞加关注,学习不迷路
微信公众号|工控小新
EPLAN电气绘图、TIA博图基础 、CAD、C语言教学、单片机基础、三菱PLC ... 每日持续更新中
- 上一篇: Java高级语言程序设计试题
- 下一篇: 6.4 数据类型转换
猜你喜欢
- 2025-01-06 C语言各类符号意思,新手小白收藏好物,看了必懂
- 2025-01-06 Go语言基础—运算符
- 2025-01-06 C++ 之父 2024 年末重磅演讲 | 重新认识 C++:跨世纪的现代演进
- 2025-01-06 50个常见 Java 错误以及如何避免它们
- 2025-01-06 JavaScript中常见的几种错误
- 2025-01-06 聊聊C语言-基本运算符
- 2025-01-06 「C语言」变量及赋值
- 2025-01-06 Python 基础之基本语法与数据类型,小白必看!
- 2025-01-06 2024年GESP6月认证Python一级试卷解析
- 2025-01-06 「Python赋值运算符」赋值运算符的使用
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)