C语言笔记初级篇第七章:结构体相关

Posted 快乐江湖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言笔记初级篇第七章:结构体相关相关的知识,希望对你有一定的参考价值。

目录

(1)结构体的声明,定义,初始化和成员访问

A:什么是结构体

B:结构体声明和定义

C:结构体的初始化

D:成员访问

(2)结构体传参

(3)结构体自引用

(4)内存对齐

(5)结构体传参

(6)位段


(1)结构体的声明,定义,初始化和成员访问

A:什么是结构体

世界上物体的性质是复杂多样的,就拿人而言,人绝对不能用一个整形数据(比如说身高),或者说字符串(比如说姓名)而单独囊括的,于是我们在描述一个复杂对象的时候,就要使用的结构体,结构体是一些值的集合,这些值称为成员变量,每个成员变量可以是不同的类型

B:结构体声明和定义

比如这里我们要描述一个学生,一个学生的信息主要包括姓名,年龄和学号组成

上述我们在main函数中通过,定义的struct Student 创建了一个结构体变量S,这样的创建方式属于局部变量

我们还可以直接在参数列表处直接定义,这样定义的就是全局变量

还有我们经常在数据结构中见到的一种写法,它其实相等于就是重新命了一个名字

C:结构体的初始化

第一点:普通初始化

第二点:嵌套初始化

结构体的成员可以是标量,数组,指针,甚至是其他结构体

D:成员访问

上述循环嵌套的访问方式如下

(2)结构体传参

结构体不能直接使用printf函数打印,需要打印时可以自己封装print函数,而这就涉及到了传参和传递地址的问题,结合前面第五章讲到的结构体指针的相关知识,就有以下两种打印方式

由于结构体的数据比较多,所以我们以后在操作时要传结构体的地址,如果传结构体的值那么对于内存的开销就比较大,如果传入地址,则只需使用一个很小的指针就能操作

(3)结构体自引用

这里以单链表结点定义为例。一个结构体有两个部分,一个部分是数据域,一个部分是指针域,在创造结点也就是建立结构体成员时,每个成员除了有一个数据域用来存放数据外还有一个指针域,在指针域里面存放的是一个地址,这个地址指向下一个结点也就是下一个结构体成员的内存地址

(4)内存对齐

具体参见:C语言重难点:内存对齐和位段_快乐江湖的博客-CSDN博客一:结构体内存对齐(1)为什么要存在内存对齐平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些平台只能在某些地址处取得某些特定类型的数据,否则抛出硬件异常。比如,当一个平台要取一个整型数据时只能在地址为4的倍数的位置取得,那么这时就需要内存对齐,否则无法访问到该整型数据。性能原因:数据结构(尤其是栈)应该尽可能的在自然边界上对齐。原因在于,为了访问未对齐内存,处理器需要作两次内存访问;而对齐的内存访问仅需一次。核心思想就是:以空间换取时间(2)结构体对齐规则https://blog.csdn.net/qq_39183034/article/details/116457144

(5)结构体传参

和前面说过的交换两个变量的经典例子一样,对结构体内的变量进行修改时需要传入地址,用结构体指针来接受,如果只是去使用结构体变量的值的话,就只传入值即可

(6)位段

具体参见

C语言重难点:内存对齐和位段_快乐江湖的博客-CSDN博客一:结构体内存对齐(1)为什么要存在内存对齐平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些平台只能在某些地址处取得某些特定类型的数据,否则抛出硬件异常。比如,当一个平台要取一个整型数据时只能在地址为4的倍数的位置取得,那么这时就需要内存对齐,否则无法访问到该整型数据。性能原因:数据结构(尤其是栈)应该尽可能的在自然边界上对齐。原因在于,为了访问未对齐内存,处理器需要作两次内存访问;而对齐的内存访问仅需一次。核心思想就是:以空间换取时间(2)结构体对齐规则https://blog.csdn.net/qq_39183034/article/details/116457144

以上是关于C语言笔记初级篇第七章:结构体相关的主要内容,如果未能解决你的问题,请参考以下文章

阅读笔记《C程序员 从校园到职场》第七章 指针和结构体

C语言初级链表(之有头节点的单向链表)

C语言学习笔记结构体

C语言初阶笔记初识结构体

C语言初阶笔记初识结构体

C语言初阶笔记初识结构体