首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01|快速回顾:一个 C 程序的完整生命周期
02|程序基石:数据与量值是如何被组织的?
03|计算单元:运算符是如何工作的?
04|控制逻辑:表达式和语句是如何协调程序运行的?
05|代码封装:函数是如何被调用的?
06|整合数据:枚举、结构与联合是如何实现的?
07|操控资源:指针是如何灵活使用内存的?
08|编译准备:预处理器是怎样处理程序代码的?
09|标准库:字符、字符串处理与数学计算
10|标准库:深入理解标准 IO
11|标准库:非本地跳转与可变参数是怎样实现的?
12|标准库:你需要了解的 C 并发编程基础知识有哪些?
13|标准库:如何使用互斥量等技术协调线程运行?
14|标准库:信号与操作系统软中断有什么关系?
15|标准库:日期、时间与实用函数
16|标准库:断言、错误处理与对齐
17|极致优化:如何实现高性能的 C 程序?
18|生产加速:C 项目需要考虑的编码规范有哪些?
19|生产加速:如何使用自动化测试确保 C 项目质量?
20|生产加速:如何使用结构化编译加速 C 项目构建?
21|实战项目:一个简单的高性能 HTTP Server
22|可执行二进制文件里有什么?
23|进程是如何使用操作系统内存的?
24|编译器在链接程序时发生了什么?
25|程序可以在运行时进行链接吗?
26|C 程序的入口真的是 main 函数吗?
27|ABI 与 API 究竟有什么区别?
28|程序如何与操作系统交互?
当前位置:
首页>>
技术小册>>
深入C语言和程序运行原理
小册名称:深入C语言和程序运行原理
### 02|程序基石:数据与量值是如何被组织的? 在编程的广阔世界里,数据与量值的组织方式是构建任何程序的基石。它们不仅决定了程序的结构和性能,还直接影响了程序的可读性和可维护性。本章将深入探讨C语言中数据与量值的组织原理,从最基本的数据类型开始,逐步深入到复杂的数据结构,揭示它们如何共同支撑起程序的骨架。 #### 一、数据类型:构建程序的基本单元 在C语言中,数据类型是组织和解释存储在内存中的数据的方式。它们定义了数据的大小、范围以及能够进行的操作。C语言提供了丰富的数据类型,包括基本数据类型、枚举类型、指针类型和构造类型(如结构体、联合体等)。 ##### 1. 基本数据类型 - **整型(Integer)**:用于表示没有小数部分的数值,如`int`、`short`、`long`、`long long`等,它们的区别在于存储空间的不同,进而影响了可表示数值的范围。 - **浮点型(Floating-Point)**:用于表示有小数部分的数值,如`float`、`double`、`long double`,这些类型提供了不同精度的浮点数表示。 - **字符型(Character)**:用于表示单个字符,如`char`,通常用于存储文本数据。 - **布尔型(Boolean)**:虽然在C语言标准中没有直接的布尔类型,但通常使用`int`或`_Bool`(C99标准引入)以及宏定义(如`#define TRUE 1`和`#define FALSE 0`)来模拟布尔类型,用于表示逻辑上的真与假。 ##### 2. 枚举类型(Enumeration) 枚举类型是一种用户定义的类型,它允许程序员为整数常量指定一个更容易理解的名字。枚举类型提高了代码的可读性,并有助于防止非法值的赋值。 ```c enum Color { RED, GREEN, BLUE }; enum Color myColor = GREEN; ``` ##### 3. 指针类型(Pointer) 指针是C语言中最强大也最危险的特征之一。它存储了变量的内存地址,允许程序直接访问和操作内存。指针的使用极大地提高了程序的灵活性,但同时也带来了内存泄漏、野指针等安全隐患。 ```c int a = 10; int *ptr = &a; // ptr 存储了变量 a 的地址 ``` #### 二、变量与常量:存储数据的容器 在C语言中,变量和常量是存储数据的两种基本方式。 ##### 1. 变量 变量是程序中用于存储数据的容器,其值在程序执行期间可以改变。变量在使用前必须先声明其类型,以便编译器知道如何为变量分配内存和进行后续操作。 ```c int score; // 声明一个整型变量 score score = 90; // 为变量 score 赋值 ``` ##### 2. 常量 常量是程序执行过程中其值不能改变的数据。C语言通过`#define`预处理器指令和`const`关键字来定义常量。 - `#define`定义的常量在预处理阶段被替换为字面量,没有类型,作用域从定义点到文件结束(或直到被`#undef`)。 ```c #define PI 3.14159 ``` - `const`定义的常量有类型,作用域受声明位置控制,更加灵活和安全。 ```c const float pi = 3.14159f; ``` #### 三、数组与字符串:批量数据的组织 当需要处理多个同类型的数据时,数组成为了首选的数据结构。数组是一种连续存储相同类型数据的线性结构,通过索引(下标)来访问元素。 ##### 1. 数组 数组的定义包括类型说明符、数组名和数组长度(可选,在C99及以后标准中支持变长数组)。 ```c int numbers[5]; // 定义一个整型数组,包含5个元素 numbers[0] = 1; // 为第一个元素赋值 ``` ##### 2. 字符串 在C语言中,字符串实际上是以空字符(`\0`)结尾的字符数组。字符串字面量在内存中也是以这种方式存储的。 ```c char greeting[] = "Hello, world!"; // 字符串数组 char ch = greeting[0]; // 访问字符串的第一个字符 ``` #### 四、结构体、联合体与枚举:复杂数据的组织 随着程序复杂度的增加,单一的数据类型往往难以满足需求,这时就需要用到更复杂的数据结构来组织数据。 ##### 1. 结构体(Structure) 结构体是一种复合数据类型,允许将不同类型的数据项组合成一个单一的类型。结构体中的每个数据项称为成员,成员之间可以通过点操作符(`.`)或箭头操作符(`->`,当结构体通过指针访问时)来访问。 ```c struct Person { char name[50]; int age; float height; }; struct Person person1; person1.name = "Alice"; // 错误:数组名不可直接赋值,应使用 strcpy 等函数 strcpy(person1.name, "Alice"); // 正确 ``` ##### 2. 联合体(Union) 联合体是一种特殊的复合数据类型,它允许在相同的内存位置存储不同的数据类型,但每次只能使用其中一个成员。联合体的大小是其最大成员的大小。 ```c union Data { int i; float f; char str[20]; }; union Data data; data.i = 10; // 当前使用整型成员 // data.f = 3.14; // 如果在此行之前未修改data.i,则f的值将是未定义的 ``` #### 五、数据组织的高级话题 ##### 1. 内存管理 在C语言中,程序员需要手动管理内存,包括分配和释放。这通常通过`malloc`、`calloc`、`realloc`等函数来分配内存,以及`free`函数来释放内存。不当的内存管理会导致内存泄漏、野指针等问题。 ##### 2. 动态数组与链表 为了处理大小可变的数据集合,程序员常常使用动态数组(如通过`realloc`调整大小的数组)或链表。链表是一种通过指针连接数据元素的线性数据结构,它允许在任意位置高效地插入和删除元素。 ##### 3. 栈与队列 栈(Stack)和队列(Queue)是两种常用的抽象数据类型,它们在程序中有着广泛的应用。栈是一种后进先出(LIFO)的数据结构,而队列是一种先进先出(FIFO)的数据结构。 #### 结语 数据与量值的组织是编程的基础,它们通过不同的数据类型和复杂的数据结构被巧妙地组合起来,构建出功能强大的程序。在C语言中,理解并掌握这些基本概念和原理,对于编写高效、可维护的代码至关重要。本章从数据类型出发,逐步深入到变量、常量、数组、字符串以及更高级的数据结构,为读者搭建了一个坚实的理论基础。希望这能为读者后续深入学习C语言和程序运行原理打下坚实的基础。
上一篇:
01|快速回顾:一个 C 程序的完整生命周期
下一篇:
03|计算单元:运算符是如何工作的?
该分类下的相关小册推荐:
c++零基础入门