C语言中的数组只能允许程序员定义存储相同类型数据。但是结构是C语言编程中允许您存储不同数据类型的数据。
结构体的定义
要想定义结构,必须用到struct关键字,struct的语句格式:
![](http://file.elecfans.com/web1/M00/6C/39/pIYBAFvjhRSAbduNAAAPXyHjpxk875.jpg)
在struct 中声明了一个含有若干新成员的数据类型。
tag是结构体标签。
member-list是标准的变量定义,比如 int i; 或者 float f,或者其他有效的变量定义。
variable-list结构变量,定义在结构的末尾,最后一个分号之前,您可以指定一个或多个结构变量。下面是声明 Book 结构的方式:
![](http://file.elecfans.com/web1/M00/6C/39/pIYBAFvjhRSAXDnwAAAT6caiYp8855.jpg)
在一般情况下,tag、member-list、variable-list这 3 部分至少要出现 2 个。以下为实例:
![](http://file.elecfans.com/web1/M00/6C/39/pIYBAFvjhRWAeQrPAACIvyeggCs305.jpg)
在上面的声明中,第一个和第二声明被编译器当作两个完全不同的类型,即使他们的成员列表是一样的,如果令 t3=&s1,则是非法的。
结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,而通常这种指针的应用是为了实现一些更高级的数据结构如链表和树等。
![](http://file.elecfans.com/web1/M00/6C/39/pIYBAFvjhRqALKYEAAAtJVnHt0Y699.jpg)
如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明,如下所示:
![](http://file.elecfans.com/web1/M00/6C/39/pIYBAFvjhRqAEMuNAAA5aiH_fMg587.jpg)
结构体变量的初始化
和其它类型变量一样,对结构体变量可以在定义时指定初始值。
![](http://file.elecfans.com/web1/M00/6C/39/pIYBAFvjhRqABr1AAAA_n5-kiY0000.jpg)
执行输出结果为:
title : C 语言author: RUNOOB subject:编程语言book_id:123456
访问结构成员
为了访问结构的成员,我们使用成员访问运算符(.)。成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号。您可以使用struct关键字来定义结构类型的变量。下面的实例演示了结构的用法:
![](http://file.elecfans.com/web1/M00/6C/39/pIYBAFvjhRuAOK3JAAAcjAAmW94778.jpg)
![](http://file.elecfans.com/web1/M00/6C/39/pIYBAFvjhRyAV7DlAAC6WbZNRz8794.jpg)
当上面的代码被编译和执行时,它会产生下列结果:
![](http://file.elecfans.com/web1/M00/6C/39/pIYBAFvjhRyAGcryAAAu7Tm_Vbg909.jpg)
结构作为函数参数
您可以把结构作为函数参数,传参方式与其他类型的变量或指针类似。您可以使用上面实例中的方式来访问结构变量:
![](http://file.elecfans.com/web1/M00/6C/39/pIYBAFvjhR2AdPX0AAAdG2Bd2d8908.jpg)
![](http://file.elecfans.com/web1/M00/6C/39/pIYBAFvjhR2AAnIoAACzal763FE111.jpg)
当上面的代码被编译和执行时,它会产生下列结果:
![](http://file.elecfans.com/web1/M00/6C/39/pIYBAFvjhR6AEesxAAAtbFQ5RBg043.jpg)
指向结构的指针
您可以定义指向结构的指针,方式与定义指向其他类型变量的指针相似,如下所示:
structBooks*struct_pointer;
现在,您可以在上述定义的指针变量中存储结构变量的地址。为了查找结构变量的地址,请把 & 运算符放在结构名称的前面,如下所示:
struct_pointer =&Book1;
为了使用指向该结构的指针访问结构的成员,您必须使用 -> 运算符,如下所示:
struct_pointer->title;
让我们使用结构指针来重写上面的实例,这将有助于您理解结构指针的概念:
![](http://file.elecfans.com/web1/M00/6C/39/pIYBAFvjhR6AEk2wAAAejj4DcbA651.jpg)
![](http://file.elecfans.com/web1/M00/6C/39/pIYBAFvjhSSAaVliAAC-Cvk_3ao925.jpg)
当上面的代码被编译和执行时,它会产生下列结果:
![](http://file.elecfans.com/web1/M00/6C/39/pIYBAFvjhSSAR8RyAAAsr1-IM7c900.jpg)
C语言
C语言
+关注
关注
165
文章
5906
浏览量
111141
结构体
结构体
+关注
关注
1
文章
33
浏览量
9648
原文标题:C语言中的结构体
文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。
收藏
人收藏
扫一扫,分享给好友
复制链接分享
评论
发布评论请先 登录
相关推荐
C语言的具体结构与基本数据类型
简单来说,一个C程序就是由若干头文件和函数组成。
STM32嵌入式开发 发表于 06-22 15:35 •
117次
阅读
安富莱C语言编码规范
以下提供两种命名方式以供参考:(1)各程序模块的文件命名开头 2 个小写字母代表本模块的功能:如:主....
硬件攻城狮 发表于 06-22 14:38 •
48次
阅读
fastcxml xml解析库
./oschina_soft/gitee-fastxml.zip
发表于 06-22 10:31 •
3次
阅读
C语言的面向接口编程
其实bug菌这么多年开发过来,真正把C完完全全用面向对象的方式进行编写是非常少的,像C++中的继承、....
FPGA之家 发表于 06-22 09:37 •
70次
阅读
AWTK-MVVM C语言MVVM框架
./oschina_soft/gitee-awtk-mvvm.zip
发表于 06-21 11:33 •
3次
阅读
开源软件-Libcsp高性能C语言并发库
./oschina_soft/libcsp.zip
发表于 06-21 10:35 •
3次
阅读
如何利用C语言去调用rust静态库呢
引言
工作中的嵌入式项目,基本都是C语言。
一直想在项目中引入一个略高级的语言,来填补C语言的一些不足。
之前有用过Mic...
发表于 06-21 10:27 •
796次
阅读
在rust中调用C语言并实现字符串打印
上篇实现了C调用rust。
此篇计划实现在rust中调用c,并实现字符串打印。
更新lib.rs
extern "C" {
fn test_putcha...
发表于 06-21 10:20 •
749次
阅读
LIB-ZO C语言协程库
./oschina_soft/gitee-lib-zo.zip
发表于 06-21 10:05 •
3次
阅读
libspng PNG图片读写库
./oschina_soft/libspng.zip
发表于 06-21 09:41 •
3次
阅读
C语言和C++到底是什么关系
首先C++和C语言本来就是两种不同的编程语言,但C++确实是对C语言的扩充和延伸,并且对C语言提供后....
一口Linux 发表于 06-20 11:28 •
105次
阅读
如何解决并发 C 应用程序中的多线程问题
本文描述如何使用 C 编程语言和标准 POSIX 线程。
使用互斥锁和信号量管理并发访问
如前所述,并发写入操作可能会导致...
发表于 06-20 09:58 •
2268次
阅读
嵌入式软件设计模式 好文值得收藏
本文引用自本人公众号文章: 嵌入式开发中的两点编程思想 C语言也很讲究设计模式?一文讲透 包....
lucky的记录与分享 发表于 06-20 09:09 •
170次
阅读
C语言实现txt文本读取与修改
#include #include #include int main(){FILE *fp = f....
嵌入式应用开发 发表于 06-17 17:06 •
464次
阅读
c语言实现一元线性回归
第一:用所给样本求出两个相关变量的(算术)平均值 第二:分别计算分子和分母:(两个公式任选其一)分子....
嵌入式应用开发 发表于 06-17 16:16 •
324次
阅读
C语言怎么跳出while函数
在C语言中while函数是经常用到的,这里说一下可以跳出while函数的几种方法。
嵌入式应用开发 发表于 06-17 15:40 •
183次
阅读
cpufetch CPU信息获取命令行工具
./oschina_soft/cpufetch.zip
发表于 06-17 15:02 •
16次
阅读
怎样用C语言去启动SOC验证环境呢
上次说到CPU的boot,今天说说SOC环境的另外一种启动方式。用C启动SOC验证环境有几个问题。
一是CPU boot过程比较慢...
发表于 06-17 14:41 •
630次
阅读
SameBoy开源的Game Boy模拟器
./oschina_soft/SameBoy.zip
发表于 06-17 11:28 •
5次
阅读
cwb C语言网络框架
./oschina_soft/gitee-cwb.zip
发表于 06-17 10:20 •
12次
阅读
ccls C/C++/ObjC语言服务器
./oschina_soft/ccls.zip
发表于 06-17 09:32 •
11次
阅读
C语言如何注释以及在哪儿注释
文件注释描述了该文件的内容,如果一个文件只声明,或实现,或测试了一个对象,并且这个对象已经在它的声明....
strongerHuang 发表于 06-17 09:22 •
138次
阅读
C语言指针相关的概念、语法及使用场景
如果问C语言中最重要、威力最大的概念是什么,答案必将是指针!威力大,意味着使用方便、高效,同时也意味....
硬件攻城狮 发表于 06-16 15:59 •
302次
阅读
怎样去设计ARM Linux系统下的c语言程序呢
正所谓:工欲善其事必先利其器
开发环境ip地址配置如下:windows工作主机地址为:192.168.1.101 linux宿主机 eth0 ip地址为19...
发表于 06-16 14:48 •
498次
阅读
常用优化编译选项对ARM平台的影响
我们知道在C语言编译时,有那么几个常用的优化编译选项,分别是-O0,-O1,-O2,-O3以及-Os。之前一直觉得既然是优化选项,顶多...
发表于 06-16 14:38 •
436次
阅读
Cmark C版本Markdown解析器
./oschina_soft/cmark.zip
发表于 06-16 14:24 •
8次
阅读
Littlewolf C语言编写的图形引擎
./oschina_soft/littlewolf.zip
发表于 06-16 14:23 •
7次
阅读
MiniLisp Lisp解释器
./oschina_soft/minilisp.zip
发表于 06-16 11:57 •
3次
阅读
MuJoCo多关节动力学物理引擎
./oschina_soft/mujoco.zip
发表于 06-16 10:56 •
11次
阅读
space-shooter.c 2D太空射击游戏
./oschina_soft/space-shooter.c.zip
发表于 06-16 10:31 •
3次
阅读
Arb任意精度区间算法C库
./oschina_soft/arb.zip
发表于 06-16 10:25 •
8次
阅读
Notcurses丰富的字符图形/TUI库
./oschina_soft/notcurses.zip
发表于 06-16 09:17 •
5次
阅读
在标准C语言中编译出来的可执行程序
在标准C语言中,编译出来的可执行程序分为代码区(text)、数据区(data)和未初始化数据区(bs....
嵌入式应用开发 发表于 06-16 09:01 •
221次
阅读
Open Golf跨平台迷你高尔夫游戏
./oschina_soft/Open-Golf.zip
发表于 06-15 09:24 •
10次
阅读
MCU说明书说有CH549的c语言,但是评估板例程包里没有,求大神帮忙
MCU说明书说有CH549的c语言,但是评估板例程包里没有,请版主帮忙找一下,谢谢
...
发表于 06-15 06:01 •
50次
阅读
如何通过Linux系统的Shell用户访问操作系统内核服务
1、Linux Shell编程介绍Shell 是一个用 C 语言编写的程序,通过 Shell 用户可以访问操作系统内核服务。Shell 既是一种命令...
发表于 06-14 16:50 •
3019次
阅读
Streamly具有C语言性能的Idiomatic Haskell
./oschina_soft/streamly.zip
发表于 06-13 11:23 •
13次
阅读
嵌入式软件常见笔试面试题汇总
1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
lucky的记录与分享 发表于 06-13 07:54 •
238次
阅读
基于51单片机的OLED显示图片文字
基于51单片机的OLED屏幕显示,可显示图片文字字母等。
王子变青蛙_35400519 发表于 06-12 00:43 •
1576次
阅读
如何提升C编程能力
GNU C:GNU的C函数库,其实就是glibc,它是Linux上最重要的函数库,它定义了 ANSI....
FPGA之家 发表于 06-09 10:24 •
235次
阅读
c语言读写表格(csv)文件 读取csv文件示例
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符....
嵌入式技术 发表于 06-08 09:22 •
565次
阅读
linux基础和C语言学习总结
学习已经近两个月了,不能说所教知识都掌握得非常好,但至少还是能跟着老师步伐、理解关键知识点、正确完成作业的。现在还没真正...
发表于 06-07 14:48 •
320次
阅读
Chafa命令行图像转换器和查看器
./oschina_soft/chafa.zip
发表于 06-07 14:34 •
18次
阅读
Zauonlok Renderer基于C语言的软件渲染器
./oschina_soft/renderer.zip
发表于 06-07 14:29 •
15次
阅读
整型的signed和unsigned详解 double的二进制位显示
C语言各种数据类型的内存映像(32位平台)
一口Linux 发表于 06-06 17:01 •
368次
阅读
详细普中51单片机开发功略
到目前为止,在电子界,如果想进入微控制器领域的学习,相信绝大多数的
人会认为要从 51 单片机开始....
发表于 06-06 14:32 •
37次
阅读
AWStudio社区版重大升级 支持高中低端全平台运行
今天我们迎来了AWStudio社区版的重大升级。AWStudio v1.1支持从云端获取自定义控件、....
科技绿洲 发表于 06-06 11:55 •
301次
阅读
怎么使用C语言控制硬件
C语言的应用编程在单片机的领域占了很大一部分,使用的比较多的51单片机和STM32单片机都可以使用M....
要长高 发表于 06-04 17:31 •
400次
阅读
如何将高级C语言编译成机器码
C编译成机器码要通过预处理,编译,汇编,链接四个步骤。这四个步骤由谁做的呢?答案是编译器。
编译器做的工作类似我们IC行...
发表于 06-01 16:53 •
2692次
阅读
zimg图像存储和处理系统
./oschina_soft/zimg.zip
发表于 05-31 10:26 •
19次
阅读
linux内核源码中的task_struct结构体
进程是处于执行期的程序以及它所管理的资源(如打开的文件、挂起的信号、进程状态、地址空间等等)的总称。....
一口Linux 发表于 05-30 14:10 •
484次
阅读
Lilliput Discord开源的图像调整工具
./oschina_soft/lilliput.zip
发表于 05-30 09:49 •
13次
阅读
ATPCS基本规则
有调用关系的所有子程序必须遵守同一种ATPCS,编译器或者汇编器在ELF格式的目标文件中设置相应的属....
安芯教育科技 发表于 05-27 10:12 •
245次
阅读
JWebFileTrans(JDownload)从网络上下载文件的程序
./oschina_soft/JDownload.zip
发表于 05-27 09:10 •
24次
阅读
详解回调函数的概念及使用步骤
回调函数就是一个被作为参数传递的函数。在C语言中,回调函数只能使用函数指针实现,在C++、Pytho....
嵌入式应用开发 发表于 05-26 15:20 •
456次
阅读
Vitis HLS工具简介及设计流程
Vitis HLS 是一种高层次综合工具,支持将 C、C++ 和 OpenCL 函数硬连线到器件逻辑....
Xilinx赛灵思官微 发表于 05-25 09:43 •
538次
阅读
基于non-OS和RT-Thread的按键库源码及应用
核心的按键扫描代码仅有三行,没错,就是经典的 三行按键扫描算法。使用 C 语言标准库 API 编写,....
硬件攻城狮 发表于 05-23 09:39 •
497次
阅读
C语言_二维数组与一维指针
字符串:本身属于字符数组、字符串结尾有’\0’。
DS小龙哥-嵌入式技术 发表于 05-21 09:11 •
554次
阅读
详解内存池技术的原理与实现
最近在网上看到了几篇篇讲述内存池技术的文章,有一篇是有IBM中国研发中心的人写的,写的不错~~文章地....
Linux内核补给站 发表于 05-20 08:58 •
3743次
阅读
微控制器中各式各样的编程语言
在上一篇文章中,我们探索了微控制器中的软件与硬件,并分析了为何微控制器的软件和硬件相辅相成缺一不可。....
东芝半导体 发表于 05-19 19:58 •
851次
阅读
|