[C/C++]详解结构体
引子
设计程序时,最重要的步骤之一就是选择表示数据的方法。在许多情况下,简单变量甚至是数组还不够。为此,C提供了结构变量(structure variable)提高表示数据的能力,它能够创造新的形式。
建立结构体声明
小栗子
需求:需要打印一份图书目录。里面包含每本书的各种信息:书名、作者、出版社、版权日期和价格。其中一些元素(例如书名和作者)可以储存在字符数组中,其他项目需要一个int或者float。如果使用5哥不同的数组分别记录每一项都比较繁琐,尤其是要创建多份列表:一份按书名排序、一份按作者排序、一份按照价格排序等。如果能把图书目录的信息都包含在一个数组里更好,其中每个元素包含一本书的相关信息。
因此,就需要一种既能包含字符串也能包含数字的数据形式,而且还要保持各信息的独立。结构体就满足这种情况下的需求。
struct Book { /* 结构体模板:标记为Book (我们通常使用首字母大写的方式来标识结构体) */
char title[128]; // 成员 or 字段
char author[40];
char publisher[256];
int date;
float price;
}
int main (void) {
struct Book book; /* 把book声明为一个Book类型的变量 */
printf("请输入书名:");
scanf("%s", book.title);
printf("请输入作者:");
scanf("%s", book.author);
printf("请输入出版社:");
scanf("%s", book.publisher);
printf("请输入出版日期:");
scanf("%d", book.date);
printf("请输入价格:");
scanf("%f", book.price);
return 0;
}
// Output
请输入书名:《C Primer Plus》
请输入作者:Stephen Prata
请输入出版社:人民邮电出版社
请输入出版日期:201604
请输入价格:59.4
建立结构声明
结构声明(structure declaration)描述了一个结构的组织布局。声明类似下面这样:
struct Book {
char title[128];
char author[40];
float price;
}
该声明描述了一个由两个字符数组和一个float类型变量组成的结构。该声明并未创建实际的数据对象,只描述了该对象由什么组成。
分析下,首先是关键字struct,它表明跟在其后的是一个结构,后面是一个标记 (例子为Book),我们可以使用该标记引用该结构。所以,我们可以在后面的程序中这样声明:
struct Book book1;
这把book1声明为一个使用Book结构布局的结构变量。
在结构声明中,用一对花括号括起来的是结构成员列表。每个成员都用自己的声明来描述。例如,title部分就是一个内涵128个元素的char类型的数组。成员可以是任意一种C的数据类型,甚至可以是其他结构体。右花括号后面的分号是声明所必需的,表示结构布局定义结束。可以把这个声明放在所有函数的外部,也可以放在一个函数定义的内部。如果把结构声明置于一个函数的内部,它的标记就只限于该函数内部使用。如果置于外部,那么该声明之后的所有函数都能使用标记。
定义结构变量
结构有两层含义。一层含义是“结构布局”,结构布局告诉编译器如何表示数据,但是它并未让编译器为数据分配空间。下一步是创建一个结构变量,即是结构的另一层含义。
struct Book book1; // 创建结构变量
初始化结构体
初始化变量和数组如下:
int count = 0;
int array[7] = {0, 1, 2, 3, 4, 5, 6};
结构变量也可以像这样进行初始化,初始化一个结构变量与初始化数组的语法类似:
struct Book book1 = {
"C Primer Plus",
"Stephen Prata",
59.4
};
我们使用在一对花括号中括起来的初始化列表进行初始化,各初始化项用逗号分隔。因此,title成员可以被初始化为一个字符串,price可以被初始化为一个数字。为了让初始化项与结构中各成员的关联更加明显,我们让每个成员的初始化项都独占一样。这样做只是为了提高代码的可读性,对编译器而言,只需要用逗号分隔各成员的初始化项即可。
访问结构体成员
结构类似于一个“超级数组”,这个超级数组中,可以是一个元素为char类型,下一个元素为float类型,下一个元素为int数组。可以通过数组下标单独访问数组中的个元素,那么,如何访问结构中的成员?使用结构成员运算符 点 (.) 访问结构中的成员。例如,book1.price即访问book1的price元素。可以像使用任何float类型变量那样使用book1.price。与此类似,可以像使用字符数组那样使用 book1.title。
本质上,.title、.author和.price的作用相当于是Book结构的下标。
所以在初始化结构体变量时,也可以指定成员:
struct Book book1 = {.price = 59.4};
既然已经是指定成员赋值了,那么就不用再考虑顺序:
struct Book book1 = {
.price = 59.4,
.title = "C Primer Plus",
.author = "Stephen Prata"
}
[C/C++]详解结构体的更多相关文章
- 菜鸟学习-C语言函数参数传递详解-结构体与数组 分类: C/C++ Nginx 2015-07-14 10:24 89人阅读 评论(0) 收藏
C语言中结构体作为函数参数,有两种方式:传值和传址. 1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数.在这种情况下 ...
- MAVLink v1.0详解——结构
本文针对 MAVLink v1.0版本,协议版本:3. MAVLink是为微型飞行器MAV(Micro Air Vehicle)设计的(LGPL)开源的通讯协议.是无人飞行器和地面站(Ground C ...
- 【2017-07-01】Linux应用开发工程师面试问题记录之二:关于结构体的大小及内存对齐问题
Tencent后台服务器开发有一道题是计算一个结构体的sizeof的大小: struct strData { int m_Int; char m_Char; short m_Short; char m ...
- 详解Go语言调度循环源码实现
转载请声明出处哦~,本篇文章发布于luozhiyun的博客: https://www.luozhiyun.com/archives/448 本文使用的go的源码15.7 概述 提到"调度&q ...
- atitit.mp4 视频文件多媒体格式结构详解
atitit.mp4 视频文件多媒体格式结构详解 1. 一.基本概念1 2. MP4文件概述2 3. mp4是由一个个“box”组成的,2 4. 典型简化mp43 5. Fragments5 6. r ...
- JAVA命令参数详解
JAVA命令参数详解 JAVA命令详解 结构 说明 Java 和 OldJava JIT 选项 另请参阅 结构 java [ options ] class [ argument ... ] java ...
- 多媒体封装格式详解---MP4
MP4文件格式详解——结构概述 http://blog.csdn.net/pirateleo/article/details/7061452 一.基本概念 1. 文件,由许多Box和FullBox组成 ...
- NetBios 的结构体详解
[NetBios 的结构体详解] NetBIOS是早期的局域网传输协议. 1.结构体. 2.命令 NetBIOS命令的使用方式有两种,即等待和非等待(或称为同步与异步)方式. 如果命令码的高阶位是0时 ...
- go语言之行--结构体(struct)详解、链表
一.struct简介 go语言中没有像类的概念,但是可以通过结构体struct实现oop(面向对象编程).struct的成员(也叫属性或字段)可以是任何类型,如普通类型.复合类型.函数.map.int ...
随机推荐
- ImageMagick:用identify检查图片是否完整?(jpg/gif/png图片是否损坏)
一,常用图片格式的结束标志是什么? 1,Jpg格式的文件在16进制中的表示是以 ff d9 两个字节结尾 2, gif格式的文件,结尾是 3b 3, png格式的文件,结尾是 00 00 00 ...
- 第七章 TCP和UDP原理
一.引入 1.TCP/IP协议族的传输层协议主要包括TCP和UDP 2.TCP是面向连接的可靠的传输层协议.它支持在并不可靠的网络上实现面向连接的可靠的数据传输 3.UDP是无连接的传输协议,主要用于 ...
- C++switch结构
- vue知识点15
1.回调地狱的三种方案:函数 promise async await 2. 子组件与子组件之间的传递: 可以借用公共父元素.子组件A this.$emit(" ...
- 链接WPA2-企业WIFI时出现无法链接到该网络,可以链接个人WIFI时的问题和解决方案
因在一个问题上掉两次坑所以还是决定记录下来,方便以后查阅. 第一次因为要部署.net 应用程序要求使用TLS1.2,所以修改了操作系统的默认启用的安全协议类型,导致好多应用程序出问题. 第二次因为vs ...
- 跟我一起学.NetCore之MVC过滤器,这篇看完走路可以仰着头走
前言 MVC过滤器在之前Asp.Net的时候就已经广泛使用啦,不管是面试还是工作,总有一个考点或是需求涉及到,可以毫不疑问的说,这个技术点是非常重要的: 在之前参与的面试中,得知很多小伙伴只知道有一两 ...
- java中的三大注解
三大注解的作用 Java三大注解分别是@Override @Deprecated @Suppresswarnings @Override 注解表名子类中覆盖了超类中的某个方法,如果写错了覆盖形式,编译 ...
- D. Alyona and Strings 解析(思維、DP)
Codeforce 682 D. Alyona and Strings 解析(思維.DP) 今天我們來看看CF682D 題目連結 題目 略,請直接看原題. 前言 a @copyright petjel ...
- 通过Python提取10000份log中的产品数据
一.背景 协助产品部门在10000份产品log信息中提取产品的SN号.IMEI号.ICCID号到Excel表格中. 1.l原始的og内容: 2.提取后的Excel表格: 二.实现 1.思路 a.for ...
- 联考day7 C. 树和森林 树形DP
题目描述 样例 样例输入 8 5 BBWWWBBW 1 2 2 3 4 5 6 7 7 8 样例输出 84 2 1 4 样例解释 分析 首先,我们要预处理出一个点到该联通块内所有点的距离之和 \(f\ ...