如何系统学习C 语言(中)之 结构体篇
1,结构体
在前面我们知道变量和数组都可以用来存储数据,变量用来存储单个数据,数组可以用来存储一组同类型的数据,但你有没有发现——它们都只适合单一属性的数据。那现实生活中,很多对象都是具有多属性的。例如一个人,都具有姓名、年龄、身高、体重等各种属性。那该如何是好呢?
别急,C语言中的结构体属于复合类型,它是其他数据类型构造出的一个新数据类型。结构体可以拥有众多的成员,而且各成员的数据类型可以各不相同。因此,它是非常适合拥有多属性的对象进行存储。
Ⅰ,结构体类型的定义
定义格式为:
struct 结构体类型名{
数据类型 成员名;
数据类型 成员名;
...
}; //特别注意此处的分号不要遗忘
下面试着定义关于人的结构体类型,例如:
struct Person{
char name[20]; //姓名
int age; //年龄
float height; //身高
float weight; //体重
};
特别注意,上面定义的是一个结构体类型,它是不能用于存储数据的。就好像int 是一个数据类型,它是不能存储数据一样。如果要存储数据需要再定义出该类型的变量,如:
int a;
下面就说一下如何定义结构体类型的变量。
Ⅱ,结构体变量的定义
1,先定义结构体类型,再定义结构体变量,例如:
struct Person p1; //注意:这条语句是定义了struct Person 类型的变量p1。也就是说,结构体类型不光是类型名字本身,前面还需加上“struct”关键字。
2,在定义结构体类型的同时定义结构体变量,例如:
struct Person{
char name[20]; //姓名
int age; //年龄
float height; //身高
float weight; //体重
} p2;
3,定义无名结构体类型变量,例如:
struct {
char name[20]; //姓名
int age; //年龄
float height; //身高
float weight; //体重
} p3;
Ⅲ,结构体变量的初始化与赋值
再定义结构体变量时,可以对其进行初始化。结构体变量的初始化方式与数组类似,使用大括号将初始值列表括起来。不过,列表中初始值的类型和顺序要与结构体成员的类型和顺序匹配。例如:
struct Person p1 = {"Tom",20,1.70f,60.1f};
Ⅳ,结构体成员的访问
C语言中,使用成员访问运算符(“.”)来访问结构体变量的各成员,我们常说的点运算说的就是它了:
结构体变量名.成员名
Ⅴ,结构体的大小
基本数据类型都有相对固定的大小,而结构体是符合数据类型,它的成员的类型、数量都是不固定的,但我们可以通过sizeof运算符来获取结构体的大小,例如:
printf("Size of the struct Person: %u bytes.\n",sizeof(struct Person));
Ⅵ,结构体的嵌套
C语言中可以将一个结构体作为另外一个结构体的成员,即允许结构体的嵌套使用,如下例子:
//定义一个日期的结构体类型Date
struct Date{
short year;
short month;
short day;
};
//然后再Person的结构体中再添加一个Date结构体类型的成员birthday,用来表示人的生日
struct {
char name[20];
int age;
float height;
float weight;
struct Date birthday; //生日
} ;
//初始化如下:
struct Person ls={"lisi",20,1.52,45.5,{1999,8,28}};
//访问birthday中的成员如下方式
ls.birthday.year;
ls.birthday.month;
2,结构体的运用
上面介绍了结构体类型与结构体变量之后,下面我们就要学着运用它了。不要让结构体孤零零的存在,要让它发挥应用的作用,应该让它与指针、数组、函数等结合起来,只有这样我们的代码才会灵活、高效、优美。
至于江湖中结构体与指针、结构体与数组、结构体与函数以及结构体与字符串的打打杀杀,亦或是人情世故,就留给我们自己到江湖上去体会吧!
如何系统学习C 语言(中)之 结构体篇的更多相关文章
- C语言中的结构体,结构体数组
C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存 ...
- C语言中处理结构体的原理
汇编中有几种寻址方式,分别是直接寻址:(ds:[idata]).寄存器间接寻址(ds:[bx]).寄存器相对寻址(ds:[bx + idata].ds:[bx + si])基址变址寻址(ds:[bx ...
- Verilog缺少一个复合数据类型,如C语言中的结构体
https://mp.weixin.qq.com/s/_9UsgUQv-MfLe8nS938cfQ Verilog中的数据类型(Data Type)是分散的,缺少一个复合数据类型:把多个wire, r ...
- C语言中的结构体和C++中的结构体以及C++中类的区别
c++中结构体可以定义一个函数 C中的结构体和C++中结构体的不同之处:在C中的结构体只能自定义数据类型,结构体中不允许有函数,而C++中的结构体可以加入成员函数. C++中的结构体和类的异同: 一. ...
- C语言中的结构体
用户自己建立自己的结构体类型 1. 定义和使用结构体变量 (1).结构体的定义 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体. (2).声明一个结构体类型的一般形式为: ...
- c语言中的结构体指针类型的cast
1.我们在c语言中会经常碰到强制类型转换. 在这,我介绍一种结构pointer类型转换,但是有前提(有点类似于c++中的继承中的子父对象的cast). 简单的介绍一下: 首先我们要知道一个结构的指针, ...
- C语言中全局结构体指针隐含的错误
前天在嵌入式系统上,调试一个数组的全局变量时,发现该变量一直会动态变化.深入分析, 才发现该全局结构体没有申请内存,而是用了一个指针.这种情况编译器是检查不出来的,在linux 上运行会挂掉,但是在裸 ...
- 018_go语言中的结构体
代码演示 package main import "fmt" type person struct { name string age int } func main() { fm ...
- Go语言中的结构体 (struct)
Golang官方称Go语言的语法相对Java语言而言要简洁很多,但是简洁背后也灵活了很多,所以很多看似很简单的代码上的细节稍不注意就会产生坑.本文主要对struct结构体的相关的语法进行总结和说明. ...
- C语言中的结构体是怎么定义的_怎么使用?
结构体的定义 // 定义结构体st struct st{ int a; // 成员a int b; // 成员b }; #include <stdio.h> struct st{ int ...
随机推荐
- python3中文乱码解决方法
解决方法: 修改pycharm配置: File->Settings->Editor->File encodings 把Global encoding设置成GBK即可
- whistle手机抓包(以安卓手机为例)
环境:whistle:1.14.6 whistle手机抓包 以安卓手机为例 手机跟电脑要连同一个wifi. 1.启动whistle 使用w2 start启动whistle. 退出cmd后,whistl ...
- [gdoi2018 day1]小学生图论题【分治NTT】
正题 题目大意 一张随机的\(n\)个点的竞赛图,给出它的\(m\)条相互无交简单路径,求这张竞赛图的期望强联通分量个数. \(1\leq n,m\leq 10^5\) 解题思路 先考虑\(m=0\) ...
- YbtOJ#732-斐波那契【特征方程,LCT】
正题 题目链接:http://www.ybtoj.com.cn/contest/125/problem/2 题目大意 给出\(n\)个点的一棵树,以\(1\)为根,每个点有点权\(a_i\).要求支持 ...
- MFC获取文件路径和文件夹路径
MFC的界面中,需要实现这样两个功能: 1.在界面上加一个按钮,单击按钮弹出一个对话框选择文件,在工程中获得文件的路径: 2.在界面上加一个按钮,单击按钮弹出一个对话框选择文件夹,在工程中获取文件夹的 ...
- mysql从零开始之MySQL UPDATE 更新
MySQL UPDATE 更新 如果我们需要修改或更新 MySQL 中的数据,我们可以使用 SQL UPDATE 命令来操作. 语法 以下是 UPDATE 命令修改 MySQL 数据表数据的通用 SQ ...
- 题解 「JOISC 2016 Day 3」电报
题目传送门 题目大意 给出一个\(n\)个点\(n\)条边的图,每个点有且仅有一个出边,改变每条边都会有对应的花费.求最小的花费使得整个图强连通. 思路 很显然,最后的图就是一个环.那我们要求的答案实 ...
- C++ 与 Visual Studio 2019 和 WSL
Visual Studio 使用 C++ 的 Linux 开发(WSL) https://devblogs.microsoft.com/cppblog/c-with-visual-studio-201 ...
- Unity——EasyTouch摇杆插件使用
EasyTouch摇杆插件使用 Demo展示 双指缩放在电脑端无法掩饰,竖屏将就看看吧: 插件名叫EasyTouch,有需要给我留言,不想开仓库传了: 创建摇杆点这里: 初始化 On_Joystick ...
- go-zero 实战之 blog 系统
go-zero 实战项目:blog 本文以 blog 的网站后台为例,着重介绍一下如何使用 go-zero 开发 blog 的用户模块. 本文涉及的所有资料都已上传 github 仓库 kougazh ...