C结构体的应用

  • (一)、什么是结构体?
  • (二)、结构体的声明:
    • 2.1介绍一下上面的结构体声明;
    • 2.2struct声明的位置
    • 2.3标记名的可省略性
  • (三)、结构体变量的定义
    • 3.1分配空间
    • 3.2对结构体和结构体变量的分析:
    • 3.3总结:
      • 3.3.1:先定义结构体类型后再定义结构体变量;
      • 3.3.2;在定义结构体类型的同时定义结构体变量
      • 3.3.3直接定义结构体类型变量.
  • (四)、结构体变量的初始化
    • 1.回忆一下普通变量的初始化
    • 2.结构体变量的整体初始化(顺序要一致)
    • 3.结构体的个别初始化(可乱序)
  • (五)、访问结构体成员变量
    • 5.1什么是结构体成员变量
    • 5.2结构体内嵌结构体怎么访问
    • 5.3结构体变量可以整体赋值但必须分开输入输出
  • (六)、结构体数组:
    • 1.为什么要用结构体数组呢/
    • 2.声明结构体数组
    • 3.结构体数组的初始化
    • 4.访问结构体数组的成员:
  • (七)、指向结构体的指针
    • 1.使用结构体指针的好处:
    • 2.声明和初始化结构体的指针
    • 怎么访问成员?

(一)、什么是结构体?

结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“成员”,其描述了一块内存区间的大小及解释意义

(二)、结构体的声明:

#include <iostream>
using namespace std;
//结果提声明
struct book
{int a;float b;
};   //这里有一个分号
int main()
{}

这个声明描述了一个整型变量和一个float变量组成的结构体,但是注意,他并没有创建一个实际的数据对象,而是描述了一个组成这类对象的元素,【因此,我们也有时候将结构体声明叫做模板,因为它勾勒出数据该如何存储,并没有实例化数据对象】。

2.1介绍一下上面的结构体声明;

1,首先使用**关键字struct**,他表示接下来是一个结构体。2;后面是一个**可选的标志**(book),它是用来引用该结构体的快速标记。
因此我们        以后就会可以这样创建数据对象
struct book library;//把library设为一个可以使用book结构体
的结构体变量,则library这个变量就包含了其book结构体中的所有元素
3;接下来就是一个**花括号**,括起了结构体成员列表,及就是每个成员变量,
使用的都是其自己的声明方式来描述,用分号来结束描述;列如;int a,字符数组就是这样声明的,用分号结束;

注意;其中每个成员可以使用任何一种c数据结构甚至是其他的结构体,也是可以的;

4;在结束花括号后的**分号**表示结构体设计定义 的结束。

2.2struct声明的位置

关于其struct声明的位置,也就是这段代码要放到哪里。同样这也是具有作用域的。

这种声明如果放在任何函数的外面,那么则可选标记可以在本文件中,
该声明的后面的所有函数都可以使用。如果这种声明在某个函数的内部,
则它的标记只能咋内部使用,并且在其声明之后;


2.3标记名的可省略性

关于我们不断说的,标记名是可选的,那么我们什么时候可以省略,什么时候一定不能省略呢?
不能省略的情况是:如果是上面那种声明定义的方法,并且想在一个地方定义结构体设计,而在其他地方定义实际的结构体变量那么就必须使用标记;
可以省略的情况是:设计的同时就创建该结构体变量,但是这种设计是一次性的,还有就是引入typedef。
第一种:

注意这里不再是定义声明结构体类型,而是直接创建结构体变量了,这个编译器会分配内存的;
这样的确可以省略标识符也就是结构体名,但是只能使用一次;因为这是;声明结构体的过程和定义结构体变量的过程和在了一起;并且个成员变量没有初始化的;
如果你想多次使用一个结构体模块,这样子是行不通的;

struct
{char title[MAXTITL]; char author[MAXAUTL];float value;
}library;

第二种:

用typedef定义新类型名来代替已有类型名,即给已有类型重新命名; 一般格式为;typedef 已有类型 新类型名;

typedef int Elem;
typedef struct{int date;..........
}STUDENT;
STUDENT stu1,stu2;
关于结构体类型的定义的总结;
一般格式就是;
struct 结构体名(也就是可选标记名)
{成员变量;
};//使用分号表示定义结束;

(三)、结构体变量的定义

3.1分配空间

之前我们结构体类型的定义(结构体的声明)只是告诉编译器该如何表示数据,但是它没有让计算机为其分配空间。我们要使用结构体,那么就需要创建变量,也就是结构体变量;

注意: 结构体变量不等于成员变量

创建一个结构体变量;struct book library;
看到这条指令,编译器才会创建一个结构体变量library,此时编译器才会按照book模板为该变量分配内存空间,并且这里存储空间都是以这个变量结合在一起的,这也是后面访问结构体变量成员的时候,我们就要用到结构体变量名来访问。

3.2对结构体和结构体变量的分析:

struct book的作用;在结构体声明中,struct book所起到的作用就像int/、float、char等基础数据类型名作用一样。

struct book s1,s2,*ss;
定义两个struct book结构体类型的结构体变量,还定义了一个指向该结构体的指针,其ss指针可以指向s1,s2,或者任何其他的book结构体变量。

其实:
struct book library;
等效于:
struct book{char …
….
…..
}librar;

这两种是等效的,只是第一种可以减少代码的编写量;

3.3总结:

3.3.1:先定义结构体类型后再定义结构体变量;

格式为;struct 结构体名 变量名列表; struct book s1,s2,*ss;

注意这种之前要先定义结构体类型后再定义变量;

3.3.2;在定义结构体类型的同时定义结构体变量

格式为; struct 结构体名 { 成员列表; }变量名列
这里结构体名是可以省的,但尽量别省;
  struct book {char title[MAXTITL];//一个字符串表示的titile 题目 ; char author[MAXAUTL];//一个字符串表示的author作者 ; float value;//一个浮点型表示的value价格; }s1,s2;

3.3.3直接定义结构体类型变量.

就是第二种中省略结构体名的情况; 这种方式不能指明结构体类型名而是直接定义结构体变量,并且在值定义一次结构体变量时适用,无结构体名的结构体类型是无法重复使用的,也就是说,后面程序不能再定义此类型变量了,除非再写一次重复的struct落、

(四)、结构体变量的初始化

1.回忆一下普通变量的初始化

2.结构体变量的整体初始化(顺序要一致)

关于结构体变量的初始化与初始化数组类似;
也是使用花括号括起来,用逗号分隔的初始化好项目列表,

注意每个初始化项目必须要和要初始化的结构体成员类型想匹配,


注意如果在定义结构体变量的时候没有初始化,那么后面就不能全部一起初始化了;
意思就是;

/这样是可以的,在定义变量的时候就初始化了;
struct book s1={//对结构体初始化 "guojiajiaoyun",//author为字符数组 "yuwen",//title为字符串 22.5};
/这种就不行了,在定义变量之后,若再要对变量的成员赋值,那么只能单个赋值了;
struct book s1;s1={ "guojiajiaoyun",//author为字符数组 "yuwen",//title为字符串 22.5  };//这样就是不行的,只能在定义的时候初始化才能全部赋值,之后就不能再全体赋值了,只能单个赋值;只能;s1.title = "yuwen";........//单个赋值;

3.结构体的个别初始化(可乱序)

(五)、访问结构体成员变量

5.1什么是结构体成员变量

结构体就像一个超级数组,在这个超级数组内,一个元素可以是char类型,下个元素就可以是flaot类型,再下个还可以是int数组型,这些都是存在的。

第一种:用结构成员运算符点(.)

结构体变量名.成员名;
注意,点其结合性是自左至右的,它在所有的运算符中优先级是最高的;

5.2结构体内嵌结构体怎么访问

结构体变量名.成员.子成员………最低一级子成员;

struct date
{int year;int month;int day;
};
struct student
{char name[10];struct date birthday;
}student1;

若想引用student的出生年月日,可表示为;student.brithday.year
brithday是student的成员;year是brithday的成员;

5.3结构体变量可以整体赋值但必须分开输入输出

1.可以整体赋值:
可以将一个结构体变量作为一个整体赋值给另一相同类型的结构体变量,可以到达整体赋值的效果;这个成员变量的值都将全部整体赋值给另外一个变量;
2.必须分开输出:
可以将一个结构体变量作为一个整体赋值给另一相同类型的结构体变量,可以到达整体赋值的效果;这个成员变量的值都将全部整体赋值给另外一个变量;

总结;除了“相同类型的结构体变量可以相互整体赋值”外,其他情况下,不能整体引用,只能对各个成员分别引用;

(六)、结构体数组:

1.为什么要用结构体数组呢/

在上面的book类型的结构体 ,每本书就需要用一个book类型的结构体变量来描述,若是要描述两本书,需要使用两个这样的变量,依次类推;因此要使用一个该结构体的数组,来表示这些图书;并且数组就是存储一组具有相同类型的数据,因此就有了结构体数组的出现.

2.声明结构体数组

与普通的数组声明一样,int a[10];int为元素的数据类型,a为数组名 【10】表示申请了10的int单元的内存;
再看结构体声明;struct book library[10];是不是类似,struct book为数组元素的数据类型,library为数组名,[10]为申请了10个struct book单元的内存;

解释;声明library为一个具体10个元素的数组,并且每个元素都book类型的结构,因此可以得到library[0],library[1]…….都是单独独立的一个book结构;
注意library本身不是结构体名而是一个数组名;

3.结构体数组的初始化

4.访问结构体数组的成员:

规则;在结构体名后加点运算符,然后再是成员名;
library[5].title;//表示第5个元素的title成员;library[5]是结构体变量名,title就是成员名;
library[5].titlt[4];//注意title是数组类型,第5个数组元素的title成员的第4个字符;
总结;

library //book结构体的数组
library[2]//数组的第二个元素,一个book结构体类型的变量名;
library[2].title;//char数组,结构体数组的第二个元素的title成员;
library[2].title[4];//表示一个字符,结构体数组的第二个元素的
title成员的第四个字符;

(七)、指向结构体的指针

1.使用结构体指针的好处:

就像指向数组的指针一样,它比数组本身更容易操作,指向结构体的指针通常也比结构体本身更容易操作;

2.声明和初始化结构体的指针

声明struct book * him;
规则就是,struct 结构体名+ * + 指针名;
这个声明不是建立一个新的结构体,而是创建了一个指针类型的him指针变量,他可以指向任何现有的book类型的结构体;
him = &library[0];

怎么访问成员?

方法一:

引入一个运算符,-> 后跟->运算符的结构体指针和后跟.点运算符的结构体名是一样操作的;
注意一点的是;不能使用him.成圆;因为him不是结构体名;

方法二;

如果him=&library[0],那么him=library[0];因为&和是一个互逆的运算符; &取地址,*取值;
=》library[0].value 等价于 (*him).value;注意必须使用圆括号,优先级问题; 然后都与him.value是一个作用;

如有问题可直接私聊博主!!!!!

32.【C/C++ 结构体全类型 (详解)】相关推荐

  1. c语言结构体成员变量私有化,C语言中结构体变量私有化详解

    C语言中结构体变量私有化详解 背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚 ...

  2. C++中的结构体vector排序详解

    C++中的结构体vector排序详解 使用sort函数对一个vector很常用,前提是通文件中必须包含#include ,但是针对结构体vector排序则需要进行一定的改动.具体事例如下所示: // ...

  3. C语言结构体与指针ppt,c语言指针和结构体:链表详解.ppt

    c语言指针和结构体:链表详解.ppt 1,第十一章 链表,2,例跳马.依下图将每一步跳马之后的位置x,y放到一个"结点"里,再用"链子穿起来",形成一条链,相邻 ...

  4. go结构体初始化_go嵌套匿名结构体的初始化详解

    go匿名结构体 嵌套匿名结构体的 示例代码片. type debugConfig struct { MaxQueueDepth int `json:"maxQueueDepth"` ...

  5. 结构体字节对齐详解【含实例】

    一.前言 结构体字节对齐属于老生常谈的问题,看似简单,却很容易忘记.而且因为结构体使用的普遍性,使得字节对齐也成为了一个不得不谈的话题. 二.什么是结构体字节对齐 假设现在有一个结构体如下,问你它的一 ...

  6. 《C语言杂记》C语言结构体和联合体详解

    1结构体概述 C 语言中有很多数据类型,数据类型决定了变量存储占用的空间,以及如何解释存储的位模式.像 int.float.char 等是由C语言本身提供的数据类型,不能再进行分拆,我们称之为基本数据 ...

  7. 结构体枚举联合详解(附例题解析)

    目录: 结构体的初始化 结构体的内存对齐 位段 -->位段的内存分配 -->位段的跨平台问题 枚举的优点 联合的特点 联合体的大小计算 结构体的初始化 struct Stu {char n ...

  8. C/C++结构体字节对齐详解

    结构体的sizeof 先看一个结构体: struct S1 {     char c;     int i; }; sizeof(S1)在VC6中按默认设置得到的结果为8. 我们先看看sizeof的定 ...

  9. Linux C Socket编程发送结构体、文件详解及实例

    利用Socket发送文件.结构体.数字等,是在Socket编程中经常需要用到的.由于Socket只能发送字符串,所以可以使用发送字符串的方式发送文件.结构体.数字等等. 本文:http://www.c ...

最新文章

  1. LeetCode简单题之比赛中的配对次数
  2. 深入解析Dropout——基本思想:以概率P舍弃部分神经元,其它神经元以概率q=1-p被保留,舍去的神经元的输出都被设置为零...
  3. C++ 拷贝构造函数应用场景
  4. IOS 学习笔记 2015-03-22 OC-API-日期
  5. fetch 自动加cookie_如何在shell中动态获取chrome浏览器的cookie信息
  6. [安全攻防进阶篇] 六.逆向分析之OllyDbg逆向CrackMe01-02及加壳判断
  7. 移动端手指操控左右滑动的菜单
  8. 实现一个靠左靠右靠中间的listview
  9. centos安装stress安装失败_CentOS安装nginx
  10. 初次安装Linux(Ubuntu)(ssh,ftp服务安装)
  11. 网络编程----观察进程的启动与停止
  12. 全国计算机二级公共基础知识电子版,全国计算机二级公共基础知识汇总.pdf
  13. 【JAVA】java代码实现print2Flash转swf文件,百度文库一样。
  14. 数据包络分析DEA有哪些指标?
  15. 2021年机修钳工(初级)免费试题及机修钳工(初级)模拟考试题
  16. python中文库_不用下载券也能下载百度文库资料,Python帮你轻松搞定
  17. VVC系列(三)xCompressCTU、xCompressCU和xCheckModeSplit解析
  18. C语言那些事之标点符号
  19. 【C语言】取余%操作在编程中的重要作
  20. 气和血1:生命在于气血

热门文章

  1. uva 815 Flooded!
  2. python 多因素方差分析_SPSS分析技术:多元方差分析
  3. Android Studio的报错提示:Error while Launching activity
  4. 不患人之不己知,患不知人也。
  5. Learning Transferable Visual Models From Natural Language Supervision
  6. mac系统升级后npm安装依赖报错gyp: No Xcode or CLT version detected
  7. R语言forestplot 根据分组设置不同颜色
  8. tensorflow--之将数字标签转化为one-hot
  9. 取消桌面上计算机控制板网络三个系统图标,大神处置win10系统桌面图标“计算机 控制面板 网络”怎么不见了的解决方的步骤...
  10. JS-Global对象