diff --git a/docs/notes/01_c-basic/02_xdx/index.md b/docs/notes/01_c-basic/02_xdx/index.md index 39a5796..2e001e5 100644 --- a/docs/notes/01_c-basic/02_xdx/index.md +++ b/docs/notes/01_c-basic/02_xdx/index.md @@ -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`。 -### 1.4.2 变量的作用 +### 1.5.2 变量的作用 * 如果我们希望计算 10 和 20 的和;那么,在计算机中需要怎么做? @@ -298,9 +360,9 @@ int num = 10; int num = 10; ``` -## 1.6 变量的重要操作 +## 1.7 变量的重要操作 -### 1.6.1 变量的输出 +### 1.7.1 变量的输出 * 在计算机中,所谓的`输入`和`输出`都是以计算机(CPU 和内存)为主体而言的,即: @@ -363,7 +425,7 @@ int main() { } ``` -### 1.6.2 计算变量的大小 +### 1.7.2 计算变量的大小 * 我们可以使用 `sizeof`关键字(运算符)来计算变量或类型所占内存空间的大小。 @@ -387,7 +449,7 @@ int main() { } ``` -### 1.6.3 获取变量的地址 +### 1.7.3 获取变量的地址 * 在 C 语言中,我们可以使用`取地址运算符 &` 来获取变量的地址。 @@ -409,7 +471,7 @@ int main() { } ``` -### 1.6.4 变量的输入 +### 1.7.4 变量的输入 * 在 C 语言中,提供了 `scanf()` 函数用于从标准输入(通常是键盘)中读取数据并根据变量的地址赋值给变量(变量需要提前声明),其函数声明是: @@ -509,9 +571,9 @@ int main() { } ``` -## 1.7 标识符 +## 1.8 标识符 -### 1.7.1 概述 +### 1.8.1 概述 * 在 C 语言中,变量、函数、数组名、结构体等要素命名的时候使用的字符序列,称为标识符。 @@ -519,7 +581,7 @@ int main() { > > 在上世纪 60 - 70 年代的时候,因为国家贫穷,人民生活不富裕等原因,家长虽然会给孩子取名为:`张建国`、`李华强`等;但是,也会取小名为`二狗子`、`狗剩`等,目的是希望孩子能健康成长(养活),像 `张建国`、`李华强`、`二狗子`、`狗剩`都是名字(标识符),伴随人的一生。 -### 1.7.2 标识符的命名规范 +### 1.8.2 标识符的命名规范 * 强制规范: * ① 只能由`小写`或`大写英文字母`,`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、b&c、j**p、book-1、tax rate、don't ``` -### 1.7.3 关键字 +### 1.8.3 关键字 * C 语言中的关键字是编译器`预定义`的`保留字`,它们有`特定`的`含义`和`用途`,用于控制程序的结构和执行。 * C80 和 C90 (ANSI C)定义的关键字,如下所示: