本章的学习内容
1、结构体,共用体,枚举类型
2、结构体变量、数组、指针的定义
3、结构体成员的引用
4、向函数传递结构体
5、动态数据结构、动态链表
基本数据类型还有个枚举类型
对于计算机硬件系统而言,实际上数据类型是不存在的,在冯诺依曼体系中,程序和代码都是以二进制存储和表示的,理解成什么就是什么类型,硬件本身是不区分类型的。高级语言中的数据类型目的是有效的组织管理数据,增强可读性。高级语言中只有基本数据类型是远远不够的,实际应用中无法表示复杂的数据结构。比如表示学生的信息(姓名、学号,成绩等)
C语言允许用户自定义数据类型--结构体
类型的表示和操作---抽象数据类型
C++中的类可以看成是抽象数据类型,C语言的结构体又可以看成是所有成员都是public的类,但是我们决不能把C++看成是带有类的C,因为两种语言的区别是考虑问题方式的不同,一种是面向过程,一种是面向对象。面向过程是分析问题的处理步骤,每一个步骤是通过函数或者过程调用来实现的。面向对象是将问题分解为对象,每个对象具有对应的操作,建立对象的目的是以数据为中心的来处理问题。 面向对象语言是以对象为基础,消息和事件来驱动对象来执行相应的操作。
学好结构体是理解C++类的基础。
为什么要定义结构体类型?
需要定义很多个数组,而且每个数组存储的是不同人的信息,而且可能会发生对齐错误。
在内存中的储情况
希望的存储方式:
结构体类型的声明,括号里为结构体的成员,注意结尾的分号,定义是一个语句。
struct student{ long studentID; char studentName[10]; char studentSex; int yearOfBirth; int scoreMath; int scoreEnglish; int scoreComputer; int scoreProgramming; };
结构体变量的定义
(1)先定义结构体类型再定义变量名
(2)在定义结构体类型的同时定义变量
struct student{ long studentID; char stutentName[10]; char studentSex; int yearOfBirth; int score[4]; } stu1;
(3)直接定义结构体变量(不指定结构体标签),这种方法不足之处就是没法重复定义变量,需要重新定义结构体类型。
struct { long studentID; char studentName[10]; char studentSex; int yearOfBirth; int score[4]; } stu1;
第一种方法更加灵活。
用typedef定义数据类型名
嵌套的结构体
结构体定义可嵌套--嵌套的结构体(Nested Structure)
在一个结构体内包含了另一个结构体作为其成员。
结构体变量的引用
访问结构体变量的成员
* 成员选择运算符(也称远点运算符) 结构体变量名.成员名
字符串赋值给字符数组一定要用字符串处理函数。
若不用初始化的方法,而用从键盘输入的方式输入结构体变量stu1的内容,那么程序如何修改?
结构体所占内存的字节数
struct 类型用内存节点数 = ?
是所有成员占内存的总和吗?
用sizeof获得结构体大小
补位不一定所有的都需要,具体加多少和机器类型,结构体定义类型等相关。
为什么要满足内存对齐的要求呢?
读取存储在没有对齐的32位数,需要读取两次,还要从64位中提取32位数,需要额外操作,所以说对齐提高了系统的效率。
改变一下结构体变量成员的顺序:
结构体数组的定义和初始化
初始化一个结构体数组,相当于存储了一个表格,往大了说,算是建立了数据库中的多条记录,每条对应一个学生信息。
例:利用结构体数组,计算每个学生的平均分。
如何定义指向结构体变量的指针?
如何访问结构体指针变量指向的结构体成员呢?
当结构体嵌套时,如何访问结构体指针变量所指向的结构体成员?
如何定义指向结构体数组的指针?
如何访问结构体指针指向的结构体数组成员?这个1不是1个字节,而是取决于数组元素存储字节数。
向函数传递结构体:
1、结构体变量作为函数参数,不影响原来的结构体,传递的是结构体的内容,p和d占用不同的内存单元
2、结构体指针作函数参数
3、结构体变量作函数返回值
4、结构体数组作函数参数
结构体作函数参数的好处?精简函数参数,使参数更简洁。
用户自定义的数据类型
结构体(struct)
*把关系紧密且逻辑相关的多种不同类型的变量,组织到统一的名字之下
共同体,也称联合(union)
*把情形互斥但逻辑相关的多种不同类型的变量,组织到统一的名字之下
共同体中的几个成员是从同一地址开始存放,sizeof(union number)取决于占空间最多的成员。
同一内存在每一瞬时只能存放其中一种类型的成员起作用的成员是最后一次存放的成员。
例 :结构体里面嵌套了一个共用体,共用体里面又嵌套了两个结构体。
枚举类型--让人遗忘的角落,基本上使用的很少。
动态数据结构--单向链表
结构体在声明的时候,不能包含本结构体类型的成员,系统没办法预知本结构体占用多少内存。
上面这个就没有问题,这个指针变量和他的基类型没有关系,能够确定pt占用4个字节(32位机器),这样的结构体类型有什么作用呢--动态数据类型
动态数据结构的典型代表--链表(Linked Table)
-特点:用一组任意的存储单元存储线性表数据。
-存储单元可以使连续的,也可以使不连续的
n个节点连接成一个表--线性表的链式存储结构,形象的称之为链表,如果只有一个指针域指向下一个节点,那么称为单向链表,如果还有一个指针域指向上一个节点,那么称为双向链表,如果最后一个节点的指针域不是空指针,而是指向了头结点,就变成了一个环形链表。
单向链表的操作:添加节点、删除节点、插入节点
-添加操作
-删除操作
-插入操作
小结
两种新的数据类型
成员选择运算符、成员指向运算符
如何向函数传递结构体
静态数据结构和动态数据结构的区别
本门课讲的是C语言中的重点中的重点,核心中的核心。熟读唐诗三百首,不会作诗也会吟。学习C语言也是这样,紧紧会语法是远远不够的,还需要大量的代码练习。熟练到一定程度的时候,闭着眼写出来的程序也比别人睁着眼写的漂亮。 人生如程序,程序亦人生,王国维在人间词话中讲了,古今成大事者,必经过三重境界,一是昨夜西风凋碧树,独上高楼,望断天涯路。二是衣带渐宽终不悔,为伊消得人憔悴。三是众里寻他千百度,蓦然回首,那人却在灯火阑珊处。
学好编程,practice,实践实践再实践!
原文:https://www.cnblogs.com/west20180522/p/13762515.html