This commit is contained in:
许大仙 2024-08-22 14:35:41 +08:00
parent d2ebe102ef
commit e99a078201

View File

@ -108,9 +108,71 @@ int main() {
} }
``` ```
## 1.4 从计算机底层看变量 ## 1.4 浅谈变量周边概念
### 1.4.1 内存条的内部结构 ### 1.4.1 数据类型
* 数据是放在内存中的,变量是给这块内存起的名字,有了变量就可以找到并使用这份数据。但是,该如何使用?
* 我们知道,对于数字、文字、符号、图形、音频、视频等数据都是以二进制的形式被加载进内存中,进而被计算机中的 CPU 所识别,它们本质上没有任何区别。那么,对于 `00010000` 这个二进制数字,我们是理解为数字 16 ?还是理解为图像中的某个像素的颜色?如果没有特别指明,我们并不清楚。
* 换言之,内存中的数据有多种解释方式;那么,我们在存储之前就必须明确指定,如: `int num = 10;` 中的 `int` 就是数据类型,用来限定 `num` (内存中的某个区域)中存储的是整数,而不是图像中某个像素的颜色。
> [!NOTE]
>
> 总结:
>
> * ① 数据类型用来说明数据的类型,确定了数据的解释方式,让计算机和程序员不会产生歧义。
> * ② C 语言中很多基本的数据类型char、short、int、long 等;如果需要,也可以组成更加复杂的数据类型(后续讲解)。
### 1.4.2 连续定义多个变量
* 为了让程序的书写更加简洁C 语言支持多个变量的连续定义,如下所示:
```c
int a,b,c;
```
```c
float m=3.14,n=4.14;
```
> [!NOTE]
>
> * ① 连续定义的多个变量以逗号`,`分隔,并且要拥有相同的数据类型。变量可以初始化,也可以不初始化。
> * ② 很多 C 语言程序员喜欢这么写;但是,本人不是很喜欢,因为连续定义可能会导致代码的可读性降低,特别是在声明时变量之间用逗号分隔,容易导致混淆。
### 1.4.3 数据的长度
* 所谓数据长度,就是指的是数据占用多少个字节。占用的字节越多,能存储的数据就越多;对于数字而言,值就会越大。反之,能存储的数字就有限。
* 多个数据在内存中是连续存储的,彼此之间是没有明显的界限的。如果不指明数据的长度,那么计算机就不知道何时才能存取结束。假设我们保存了一个整数 1000 ,它占用 4 个字节的内存,而读取它的时候却读取了 3 个字节或5 个字节;那么,显示是不正确的。
* 所以,在定义变量的时候还要指明数据的长度,而这恰恰是数据类型的另外一个作用,即:`数据类型除了指明数据的解释方式,还指明了数据的长度`。
> [!NOTE]
>
> 总结:在 C 语言中,每一种数据类型所占用的字节数都是固定的,知道了数据类型,也就知道了数据的长度。
* 在 32 位环境中,各种数据类型的长度,如下所示:
| 数据类型 | 长度(字节) |
| ----------------- | ------------ |
| `char` | 1 |
| `short` | 2 |
| `int` | 4 |
| `long` | 4 |
| `long long` | 8 |
| `float` | 4 |
| `double` | 8 |
| `long double` | 8 |
| `pointer`(指针) | 4 |
> [!NOTE]
>
> * ① C 语言有多少种数据类型,每种数据类型长度是多少、该如何使用,这是每一位 C 程序员都必须要掌握的。当然,不必担心,后续还会一一讲解的。
>
> * ② 需要说明的是:数据类型只在定义变量时指明,而且必须指明;使用变量时无需再指明,因为此时的数据类型已经确定了。
## 1.5 从计算机底层看变量
### 1.5.1 内存条的内部结构
* 如果只看内存条的外观,无非就是一些集成电路和颗粒而已,如下所示: * 如果只看内存条的外观,无非就是一些集成电路和颗粒而已,如下所示:
@ -190,7 +252,7 @@ int main() {
* 综上所示,内存条的分层结构就是 `Channel > DIMM > Rank -> Chip -> Bank -> Row/Column` * 综上所示,内存条的分层结构就是 `Channel > DIMM > Rank -> Chip -> Bank -> Row/Column`
### 1.4.2 变量的作用 ### 1.5.2 变量的作用
* 如果我们希望计算 10 和 20 的和;那么,在计算机中需要怎么做? * 如果我们希望计算 10 和 20 的和;那么,在计算机中需要怎么做?
@ -298,9 +360,9 @@ int num = 10;
int num = 10; int num = 10;
``` ```
## 1.6 变量的重要操作 ## 1.7 变量的重要操作
### 1.6.1 变量的输出 ### 1.7.1 变量的输出
* 在计算机中,所谓的`输入`和`输出`都是以计算机CPU 和内存)为主体而言的,即: * 在计算机中,所谓的`输入`和`输出`都是以计算机CPU 和内存)为主体而言的,即:
@ -363,7 +425,7 @@ int main() {
} }
``` ```
### 1.6.2 计算变量的大小 ### 1.7.2 计算变量的大小
* 我们可以使用 `sizeof`关键字(运算符)来计算变量或类型所占内存空间的大小。 * 我们可以使用 `sizeof`关键字(运算符)来计算变量或类型所占内存空间的大小。
@ -387,7 +449,7 @@ int main() {
} }
``` ```
### 1.6.3 获取变量的地址 ### 1.7.3 获取变量的地址
* 在 C 语言中,我们可以使用`取地址运算符 &` 来获取变量的地址。 * 在 C 语言中,我们可以使用`取地址运算符 &` 来获取变量的地址。
@ -409,7 +471,7 @@ int main() {
} }
``` ```
### 1.6.4 变量的输入 ### 1.7.4 变量的输入
* 在 C 语言中,提供了 `scanf()` 函数用于从标准输入(通常是键盘)中读取数据并根据变量的地址赋值给变量(变量需要提前声明),其函数声明是: * 在 C 语言中,提供了 `scanf()` 函数用于从标准输入(通常是键盘)中读取数据并根据变量的地址赋值给变量(变量需要提前声明),其函数声明是:
@ -509,9 +571,9 @@ int main() {
} }
``` ```
## 1.7 标识符 ## 1.8 标识符
### 1.7.1 概述 ### 1.8.1 概述
* 在 C 语言中,变量、函数、数组名、结构体等要素命名的时候使用的字符序列,称为标识符。 * 在 C 语言中,变量、函数、数组名、结构体等要素命名的时候使用的字符序列,称为标识符。
@ -519,7 +581,7 @@ int main() {
> >
> 在上世纪 60 - 70 年代的时候,因为国家贫穷,人民生活不富裕等原因,家长虽然会给孩子取名为:`张建国`、`李华强`等;但是,也会取小名为`二狗子`、`狗剩`等,目的是希望孩子能健康成长(养活),像 `张建国`、`李华强`、`二狗子`、`狗剩`都是名字(标识符),伴随人的一生。 > 在上世纪 60 - 70 年代的时候,因为国家贫穷,人民生活不富裕等原因,家长虽然会给孩子取名为:`张建国`、`李华强`等;但是,也会取小名为`二狗子`、`狗剩`等,目的是希望孩子能健康成长(养活),像 `张建国`、`李华强`、`二狗子`、`狗剩`都是名字(标识符),伴随人的一生。
### 1.7.2 标识符的命名规范 ### 1.8.2 标识符的命名规范
* 强制规范: * 强制规范:
* ① 只能由`小写`或`大写英文字母``0-9` 或 `_` 组成。 * ① 只能由`小写`或`大写英文字母``0-9` 或 `_` 组成。
@ -550,7 +612,7 @@ a、BOOK_sun、MAX_SIZE、Mouse、student23、Football、FOOTBALL、max、_add
$zj、3sum、ab#cd、23student、Foot-baii、s.com、bc、j**p、book-1、tax rate、don't $zj、3sum、ab#cd、23student、Foot-baii、s.com、bc、j**p、book-1、tax rate、don't
``` ```
### 1.7.3 关键字 ### 1.8.3 关键字
* C 语言中的关键字是编译器`预定义`的`保留字`,它们有`特定`的`含义`和`用途`,用于控制程序的结构和执行。 * C 语言中的关键字是编译器`预定义`的`保留字`,它们有`特定`的`含义`和`用途`,用于控制程序的结构和执行。
* C80 和 C90 ANSI C定义的关键字如下所示 * C80 和 C90 ANSI C定义的关键字如下所示