《C语言深度剖析》第一章 关键字详解 p5 C语言从入门到入土(进阶篇)(一)

简介: 本章节文章是作者通过观看《C语言深度剖析》等各种资料总结的精华,基础部分省略了不少,是为了让大家能够更加深入了解C语言的魅力!因为为了避免与之前的文章发生赘述,所以就直接讲作者认为的精华部分哈!现在正文开始!

extern 声明关键字

就是声明不在本函数内的变量或函数。

PS:声明不开辟空间,头文件中不能有变量的定义,只能放在源文件中。


struct 结构体关键字


为什么需要结构体?


因为我们计算的场景变量有多种,类别有多种,即场景决定我们需要结构体。

9.png

我们定义了一个结构体,准确的说是一个结构体类型(struct stu)。当然,main函数内部的就是结构体变量。


10.png11.png



这是说这么写不容易阅读,但可以便于我们理解。(不推荐这么写哈)

其实结构体在我们生活中很常见:比如你的身份证,比如快递单都是,即对于人等物件的管理变成了对数据的管理。这种思想很重要哈,让我们看见不一样的世界。


初始化和访问就简单提一下,因为前面的文章单独讲过结构体哈:

12.png

13.png

结构体能整体被初始化,不能整体被赋值(要一个一个赋值)。

14.png

当然strcpy是要传地址,但是这里看起来不是,这个在后面讲数组和指针的时候再细谈哈。

15.png


对于VS函数不安全报错的消除的两种方法

这里报错说strcpy是不安全的,对于VS函数不安全报错的消除,这里有两种方法:


法一:#define _CRT_SECURE_NO_WARNINGS 1


法二:#progma warning(disable:4996);


(但是要注意,写的话都要写在头文件那一块,一写在第一行,二可以写在后面一点(这样是肯定是对的,但是对于法一是不是一定要写在第一行作者没有详细去测试,大家有兴趣的可以去试试哈))


16.png


这就是结构体指针访问结构体成员变量。

当然上面比较麻烦:

printf("%s\n",p->name);

这个更简单,->是有指针才能用哈。


为什么结构体访问有两种方式?

C语言是面向过程的语言,即有大量函数,有函数就要传参,又在我们传参的时候可能会传结构体,但是结构体非常大,我们传值过去临时拷贝就大,效率就低,所以就建议传指针。简单说,结构体在定义的时候,用  .  方便些,在传参的时候 -> 方便些。


又一个问题:空结构体多大?

:看平台。VS中要求最少要有一个成员,即无空结构体(报错)    

                gcc中为0,且能定义变量,此变量空间大小为0!但是不能使用!

             (即能不能开辟为0的空间是编译器决定的)


柔性数组

17.png


18.png


VS是可以编过的。

19.png


linux也可以。

但是我们不建议第一个元素就是arr【0】这样,前面至少要有一个有效元素。最后一个才是柔型数组。当然要是上面写成 arr【】没有0,前面就要有有效元素,不然就报错。


柔性数组怎么用?

20.png21.png


这是多申请了10个字节的空间。    

谁的地址最低?

22.png

23.png


说明最上面的地址最低。下面这图也可以更好地说明。


24.png


union 关键字(联合体关键字)

联合体也可以用  .   或者  -> 操作符进行成员访问。

25.png


那我们先问一下a和b谁是第一个元素?


26.png


联合体变量的地址和联合体最大(所占空间最大)变量的地址是一样的。


在这里再补充一个内容其实也是作者之前疑惑了很久的一个问题:

我们都知道开辟函数栈帧是在栈区,而栈区又是高地址低地址使用,而数组的地址又是递增的,那开辟数组的空间,其中数组的内容是如何分布的呢?


27.png

所以b也是和a和x的地址都是一样的,即联合体内所有成员的起始地址都一样。

即永远在a的低地址处。(每一个元素都是第一个元素)

28.png


也有内存对齐,简单说就是联合体的总大小必须可以除以任何一个数据的类型

8.png


相关文章
|
3月前
|
C语言
|
3月前
|
存储 C语言
C语言中static关键字的作用与用法解析
C语言中static关键字的作用与用法解析
|
4月前
|
存储 C语言
C语言中的typedef关键字:为类型定义新名称
C语言中的typedef关键字:为类型定义新名称
|
4月前
|
C语言
深入探索C语言中的sizeof关键字
深入探索C语言中的sizeof关键字
|
4月前
|
存储 编译器 C语言
C语言中的关键字与标识符详解
C语言中的关键字与标识符详解
|
10天前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
25 3
|
1天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
17 10
|
5天前
|
存储 编译器 C语言
C语言函数的定义与函数的声明的区别
C语言中,函数的定义包含函数的实现,即具体执行的代码块;而函数的声明仅描述函数的名称、返回类型和参数列表,用于告知编译器函数的存在,但不包含实现细节。声明通常放在头文件中,定义则在源文件中。
|
11天前
|
C语言
c语言回顾-函数递归(上)
c语言回顾-函数递归(上)
27 2