AL控制组——C语言结构笔记

说明:笔记内容是观看翁恺老师的C语言课程视频中记录的,笔记内容有部分来自于原文内容,有部分来自于自身的思考。

以下排列顺序以一个视频为一个片段,请享用。

目录

一、枚举

用法:

Ⅰ、列举赋值

套路:自动计数的枚举

Ⅱ、跳跃赋值

特性:

部分问题:

二、结构类型

声明结构的形式

结构的初始化

结构成员

结构运算

结构指针

三、结构与参数

如何输入结构

如何从函数中返回更改后的结构

方法一:(将返回值赋值给传入的结构)

方法二补充:指向结构的指针

方法二:(结构指针作为参数)

四、结构中的结构

结构数组

结构中的结构

嵌套的结构

五、类型定义

自定义数据类型(typedef)

对于结构而言:

几种用法:

 六、联合

运行原理:

用途:


一、枚举

常量符号化——以便可读性,便于理解(加入const使其变得不可修改)。

如:

 

枚举

用法:

 

Ⅰ、列举赋值

常使用的是大括号里的名字,且里面相当于是常量符号,类型为int,值从0开始赋值 排列。如:

 

其中red为0,yellow为1,green为2.

套路:自动计数的枚举

在每次命名后加入一个名字作为计数,此时该常量代表的数字就是所有有意义的名字个数。

作用:便于遍历与数组下标上限。

(原因:从0计数,到有意义名字后面再添加的那一个常量名字,刚好等于前面个数)

Ⅱ、跳跃赋值

其中也可在声明枚举量时指定值,如:

 

其中YELLOW等于1+1,也就是2;且中间的3、4无代表名称,存在空洞。

定义枚举的意义就是给常量名字用于排列。

特性:

     1.枚举量可作为值;

     2.枚举类型可跟上enum作为类型(意义不大,很少用)

     3.枚举量实际以整数来作内部计算和外部输入输出

; 

部分问题:

有的编译器(过去)在给枚举量赋值时,必须要用枚举量,不能用整数,或者 用强制类型转换为枚举量才能通过编译。

但如今编译器对这个事情放松了,比如下面代码可以通过编译,而不出现error 或warning。

 

 

二、结构类型

结构

 

上面就是结构的运用例子,其中声明类似于函数(但是没有参数),需要在前面先声明,才能使用。

Ps:struct声明时,需要在最后大括号后面加入分号(不同于函数)

小技巧:如果声明在某函数里面,那么外面的函数将无法使用,所以可以选择放在外面单独声明,使得其他函数可以访问到。

而定义可以与声明一起,也可在函数内部,类似定义一个int变量一样,定义结构变量

Ps:这里要注意,定义时需要将struct跟声明名称一起带上,如 struct 结构名称 变量名称; 。

声明结构的形式

 

在里面,法一与法三等价,均声明了结构名字与定义了两个变量p1、p2;而法二则只是定义两个变量p1、p2,并没有声明point,是无名结构。

Ps:法一与法三比较常用,而法二一般是声明者不希望在很后面继续使用这个结构,而只是为了得到变量而采用。

结构的初始化

 

法一通过大括号括起内容,并用逗号分别将赋的值隔开,值会依次赋给结构里面的变量(从先定义到后定义);

而法二通过大括号括起内容后,利用 .变量名称 这种方式,分别给结构内特定的变量赋值,此时其他未赋值变量会被自动填为0;

无论哪种方式,均类似于数组的两种初始化方法,可联合记忆。

结构成员

访问方式:利用.运算符访问成员(.运算符——>成员运算符)

与数组成员的区别:数组成员的类型是固定单一的,而结构成员类型可以不唯一。

结构运算

1.可以直接用结构变量名字访问整个结构;

2.对于整个结构,可以做赋值、取地址,以及传递给函数参数;

3.结构可以强制类型转换和结构之间的赋值(数组不能)

 

如上图操作,数组无法进行,而结构可以,且两个结构只是将值打印给另一个结构,并不是指向同一个地方。因此修改一个结构的值,不会影响另一个结构。(不同于数组)

结构指针

结构变量必须使用&运算符取地址(不同于数组那种名字就是地址)

形式:struct date *pDate = &today;

三、结构与参数

结构作为函数参数

形式:int numberOfDays ( struct date d );——>可整个结构作为参数的值传入

作用原理:在函数内新建一个结构变量,并复制传入的结构的值(类似于普通变量传值);

Ps:可返回一个结构。

一些补充:

 

上面代码中,可以看出,.运算符优先级高于&运算符,因此是取出成员变量的地址;

其二:%i在scanf中,表示读入一个数(不论其为八进制、十进制、十六进制),根据数前面的特征判断读入的数为什么进制数(如八进制于前面加0,十六进制加0x或0X)。

如何输入结构

在C语言中,没有直接的方式来一次性scanf(读入)一个结构,因此需要自己写一个函数来读入结构(如果需要输入的话)

 

根据运行,可知getStruct函数输出结果跟output输出结果不同,说明了getStruct函数的更改并没有对y的值起作用,因此需要进行改动使得能从函数中返回更改后的结构。

如何从函数中返回更改后的结构

讨论原因:结构类似于普通变量一样,作为函数参数时仅传入值,因此无法在函数内部更改后,在原函数的结构值也发生更改。

(这部分可以选择看函数部分及本地变量与全局变量部分的视频,更有助于理解)

方法一:(将返回值赋值给传入的结构)

 

这种方法将函数内处理的结果,作为返回值再拷贝到作为参数传入的结构内,将原结构(如上图y)的值更改。

方法二补充:指向结构的指针

 

更改结构指针内的成员变量时,可以采用上面两种方法。

其中法一的含义是:指针p所指结构的成员变量month等于12;

而法二使用了—>运算符,—>运算符表示指针所指的结构变量中的成员。

方法二:(结构指针作为参数)

 

 

这种方法直接传入指针,使得能直接更改传入者y的值,有利于节省运行空间,省去拷贝工作,直接在结构本身更改值并传出。(推荐)

补充:上面代码中,getStruct函数为struct point *类型(由需要返回值的特征决定函数类型),是类似于定义一个指针时,需要带上*表明定义的是一个指针(类似int *p,具体知识可看C语言指针笔记或者相关视频)

四、结构中的结构

结构数组

形式如:

 

解释:定义了一个结构数组dates,每个数组单元的类型都是结构date。

用法:可以储存多个结构(类似于数组存储变量),且可以通过.运算符访问结构里面的成员变量。如:

结构中的结构

形式如:

嵌套的结构

如图

 

如果有变量定义:

struct rectangle r , *rp;

rp = &r;

那么下面四种形式等价:

r.pt1.x

(r.pt1).x

rp—>pt1.x

(rp—>pt1).x

但是没有rp—>pt1—>x(因为pr1不是指针)

总结:

有了结构,可以定义自己想要的变量类型,并且可以嵌套[坏笑],比如结构的结构的数组,或者数组的结构等等。

五、类型定义

自定义数据类型(typedef)

作用:声明一个已有的数据类型的新名字,如 typedef int Length; ,使得Length成为int类型的别名,从而可以以自己命名的类型定义变量和参数,如Length a,b(等价于 int a,b; )

形式:typedef 已有的数据类型名字 自定义新名字

(仅限一个单词,前面的所有内容均为已有的数据类型名字)

意义:改善程序可读性(比如消除了结构定义变量时需要打struct 结构名字)。如:

 

对于结构而言:

图一:

 

图一中的date是结构名字,而Date是整个结构的新名字(即Date等价于struct date),这里需要注意,整个结构的新名字所放位置在大括号结尾部分(分号之前),位置与定义结构变量的一种方式相同(因此需要注意区分有无typedef)。

图二:

 

图二定义了一个无名结构,并使整个结构叫做Date。(因为这样已经不关心结构名字了)

几种用法:

 六、联合

形式如:

 

其中test为联合名字。(声明及定义形式与结构相同,可参考结构)

特性:

  1. 所有成员共享一个空间;
  2. 同一时间只有一个成员是有效的;(因为其他值填入时,原先值会被覆盖掉)
  3. union的大小为其最大的成员

(即sizeof(union 联合名字)=sizeof(每个成员)的最大值)

初始化方式:对第一个成员做初始化

运行原理:

 

解释:对于printf里引号内的0表示,输出时无0要补0,而2和X共同代表显示两个十六进制数字,hh表示就是一个字节(输出为8位)。

分析:

 

根据上面代码,我们在联合chi的成员i中填入1234,且根据查询,知道了其十六进制数位04D2,于是我们输出联合chi的成员ch数组。

根据猜想,应该输出为00 00 04 D2(以a[0]=00,a[1]=00,a[2]=04,a[3]=D2来分析)

编译运行:

 

可见输出为D2 04 00 00,跟猜想倒过来了,因此可以知道,计算机是从低位到高位进行输出(即低位在前),原因是现今x86的cpu为小端机器。

从这个也可以看出,即使chi的成员ch数组没有填入数字,依然可以输出,也说明它们是共用一个空间。

用途:

  1. 得到一个整数、double、或者float的内部字节;
  2. 当需要做文件操作,把一个整数以二进制的形式写到文件里面的时候,充当我们做读写的工具。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值