如何系统学习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 ...
随机推荐
- win10蓝牙鼠标无法连接,需pin码
从控制面板进到"设备和打印机",点击"添加设备" 鼠标切换到匹配模式,就可以看到自己的鼠标了,点"下一步" 出现了一样的画面,是的,不用输P ...
- 鸿蒙内核源码分析(管道文件篇) | 如何降低数据流动成本 | 百篇博客分析OpenHarmony源码 | v70.01
百篇博客系列篇.本篇为: v70.xx 鸿蒙内核源码分析(管道文件篇) | 如何降低数据流动成本 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一 ...
- WPF进阶技巧和实战02-布局
窗体 无边框 窗体无边框(最大化及标题位置)WindowStyle="None" 窗体透明 AllowsTransparency="True",必须设置窗体无边 ...
- 请求既有multipartFile,也有实体的解决方案
上回书我们说到,我们在发文件上传请求的时候,携带数据 this.fileData.append('trainName', this.dataModel.trainName); // 添加培训名称 然后 ...
- 实验3:OpenFlow协议分析实践
作业链接:实验3:OpenFlow协议分析实践 一.实验目的 能够运用 wireshark 对 OpenFlow 协议数据交互过程进行抓包: 能够借助包解析工具,分析与解释 OpenFlow协议的数据 ...
- 使用gitlab runner进行CI(三):使用sonarqube做c++的静态检查
目录 1. gitlab-ci.yml的配置 1.1 几个基本概念 1.2 使用CI进行代码检查demo 2. Sonarqube安装和配置 2.1 Sonarqube安装 2.2 数据库配置 2.3 ...
- 基于python深度学习的apk风险预测脚本
基于python深度学习的apk风险预测脚本 为了有效判断安卓apk有无恶意操作,利用python脚本,通过解包apk文件,对其中xml文件进行特征提取,通过机器学习构建模型,预测位置的apk包是否有 ...
- Nginx安装及核心配置解析
安装 使用yum进行安装 yum install -y nginx 查看nginx的安装位置 whereis nginx 启动测试 nginx 核心配置文件结构 读取Nginx自带的Nginx配置文件 ...
- 浅尝装饰器-@staticmethod 和@classmethod
[写在前面] 本帖归属于装饰器单元的学习,可以点击关键词'装饰器'查看其他博文讲解 [正文部分] 说到装饰器一开始我觉得很陌生,看了一下别人的博客讲解,原来以前学习遇到的静态方法@staticmeth ...
- 指标统计:基于流计算 Oceanus(Flink) 实现实时 UVPV 统计
作者:吴云涛,腾讯 CSIG 高级工程师导语 | 最近梳理了一下如何用 Flink 来实现实时的 UV.PV 指标的统计,并和公司内微视部门的同事交流.然后针对该场景做了简化,并发现使用 Flink ...