第6章 C语言教程 - 数组
第6章 数组1. 数组的深入理解1.1 数组的基本概念数组是一种存储相同类型元素的集合,这些元素在内存中连续存储。数组的大小在声明时确定,之后不能改变。 1.1.1 数组的内存布局数组在内存中是连续存储的,每个元素占用相同大小的内存空间。对于一个类型为 type 的数组 array_name[size],其内存布局如下: 12345+---------------------+---------------------+---------------------+---+---------------------+| array_name[0] | array_name[1] | array_name[2] |...| array_name[size-1] |+---------------------+---------------------+---------------------+---+---------------------+| 内存地址: base | 内存地址: base+size | 内存地址: base+2...
第7章 C语言教程 - 指针
第7章 指针1. 指针的概念1.1 什么是指针指针是一种变量,用于存储内存地址。它指向内存中的某个位置,可以通过指针访问或修改该位置的数据。 1.2 指针的作用 直接访问内存:通过指针可以直接访问和修改内存中的数据 传递大型数据:通过传递指针而不是整个数据,可以提高函数调用的效率 动态内存分配:用于管理动态分配的内存 实现数据结构:如链表、树、图等 函数指针:用于实现回调函数和多态 2. 指针的声明与初始化2.1 指针声明指针声明的基本语法: 1类型 *指针变量名; 其中: 类型 是指针指向的数据类型 * 表示这是一个指针变量 指针变量名 是指针变量的名称 示例: 1234int *p; // 指向int类型的指针char *str; // 指向char类型的指针float *fp; // 指向float类型的指针void *vp; // 通用指针(可指向任何类型) 2.2 指针初始化指针可以通过以下方式初始化: 使用地址运算符 &: 12int num = 10;int *p = # /...
第8章 C语言教程 - 字符串
第8章 字符串1. 字符串的深入理解1.1 字符串的基本概念在 C 语言中,字符串是由零个或多个字符组成的序列,以空字符 '\0' 结尾。空字符是一个值为 0 的字符,用于标记字符串的结束。 1.1.1 字符串的内存表示字符串在内存中是连续存储的字符序列,最后跟着一个空字符。 123+---+---+---+---+---+---+| H | e | l | l | o | \0|+---+---+---+---+---+---+ 对于字符串字面量,编译器会在内存的只读数据段中为其分配空间。 123char *str = "Hello";// "Hello" 存储在只读数据段// str 存储在栈中,指向 "Hello" 的首地址 对于字符数组,编译器会在栈或堆中为其分配空间(取决于数组的作用域)。 123char str[] = "Hello";// 整个数组存储在栈中// 包含 'H', 'e', 'l', '...
第9章 C语言教程 - 结构体与联合体
第9章 结构体与联合体1. 结构体的深入理解1.1 结构体的基本概念结构体是一种复合数据类型,它可以包含不同类型的成员变量,这些成员变量被组织在一起,形成一个有意义的数据单元。 1.1.1 结构体的内存布局结构体的成员在内存中是连续存储的,每个成员的内存地址都按照其声明的顺序依次排列。编译器会根据成员的类型和对齐要求来分配内存。 12345678910111213struct Point{ int x; // 4 字节 int y; // 4 字节};// 内存布局:// +--------+--------+// | x | y |// +--------+--------+// 0 4 8printf("结构体大小:%zu 字节\n", sizeof(struct Point)); // 输出 8 1.2 结构体的声明1.2.1 基本声明12345678910111213141516171819202122// 声明结构体类型struct struct_name...
第10章 C语言教程 - 内存管理
第10章 内存管理内存的基本概念内存区域C 程序在运行时使用的内存通常分为以下几个区域,每个区域都有其特定的用途和特点: 代码区(Text Segment) 存储程序的可执行指令 通常是只读的,防止程序意外修改指令 大小在编译时确定 包含函数体的二进制机器码 全局/静态区(Data Segment) 存储全局变量和静态变量 分为初始化部分(.data)和未初始化部分(.bss) .data 段:存储已初始化的全局变量和静态变量 .bss 段:存储未初始化的全局变量和静态变量,会被自动初始化为 0 大小在编译时确定 常量区(Constant Segment) 存储字符串字面量和其他常量 通常是只读的 例如:"Hello, World!" 存储在常量区 栈区(Stack) 存储局部变量、函数参数和返回地址 自动分配和释放,由编译器管理 后进先出(LIFO)结构 大小通常较小(几兆字节) 栈溢出会导致程序崩溃 堆区(Heap) 存储动态分配的内存 由程序员手动分配和释放 大小通常较大(几百兆字节到几吉字节) 内存分配和释放的顺序...
第11章 C语言教程 - 文件输入/输出
第11章 文件输入/输出文件的基本概念文件是存储在外部存储设备(如硬盘、U盘、SD卡等)上的数据流,具有唯一的名称和路径。文件是持久化存储数据的重要方式,也是程序与外部世界交互的重要媒介。 文件系统文件系统是操作系统用于管理存储设备上文件的方法和数据结构,它负责: 文件组织 - 将文件组织成目录结构 空间管理 - 分配和回收存储空间 文件访问 - 控制对文件的读写操作 文件保护 - 提供文件权限和安全机制 常见的文件系统包括: FAT32 - 适用于移动设备的文件系统 NTFS - Windows 系统的主要文件系统 EXT4 - Linux 系统的主要文件系统 APFS - macOS 系统的主要文件系统 文件分类在 C 语言中,文件可以分为以下两种类型: 文本文件 以字符序列形式存储 每行以换行符结束(不同系统换行符可能不同:Windows 是 \r\n,Linux/Unix 是 \n,macOS 是 \n) 可以用文本编辑器直接查看和编辑 适合存储人类可读的数据,如代码、配置文件、文档等 二进制文件 以字节序列形式存储 直接存储数据的二...
第12章 C语言教程 - 预处理指令
第12章 预处理指令1. 预处理的概念1.1 什么是预处理预处理是C语言编译过程的第一步,在编译之前对源代码进行处理。预处理指令以#开头,用于执行宏展开、文件包含、条件编译等操作。 1.2 预处理的作用 宏定义与展开:定义常量、函数宏等,提高代码可读性和可维护性 文件包含:将其他文件的内容包含到当前文件中 条件编译:根据条件选择性地编译代码 行控制:控制编译错误和警告的行号信息 诊断信息:生成编译诊断信息 2. 宏定义2.1 基本宏定义基本宏定义的语法: 1#define 宏名 替换文本 示例: 123#define PI 3.1415926#define MAX_SIZE 1024#define MESSAGE "Hello, world!" 2.2 带参数的宏带参数的宏可以像函数一样接受参数: 1#define 宏名(参数列表) 替换文本 示例: 123#define MAX(a, b) ((a) > (b) ? (a) : (b))#define MIN(a, b) ((a) < (b) ? (a) : (b))#define SQU...
第13章 C语言教程 - 多文件编程
第13章 多文件编程1. 多文件编程的概念1.1 什么是多文件编程多文件编程是将一个大型C语言程序分割成多个源文件和头文件进行开发的方法。通过这种方式,可以提高代码的可读性、可维护性和可重用性。 1.2 多文件编程的优势 代码组织:将相关功能的代码放在同一个文件中,提高代码的组织结构 模块化:每个文件可以看作一个模块,独立开发和测试 可重用性:模块可以被多个程序重用 编译速度:修改一个文件后,只需要重新编译该文件,而不是整个程序 团队协作:多个开发者可以同时开发不同的文件 1.3 多文件编程的基本结构一个典型的多文件C程序结构包括: 头文件(.h):包含函数声明、宏定义、类型定义等 源文件(.c):包含函数实现、变量定义等 主文件(.c):包含main函数,是程序的入口点 2. 头文件的设计2.1 头文件的作用头文件的主要作用包括: 函数声明:声明在其他源文件中定义的函数 类型定义:定义结构体、联合体、枚举等类型 宏定义:定义常量、宏函数等 变量声明:声明全局变量 包含其他头文件:包含程序所需的其他头文件 2.2 头文件的命名规范 使用有意义的名称:头文件名称应反映其包...
第14章 C语言教程 - 静态库与动态库
第14章 静态库与动态库1. 库的概念1.1 什么是库库是一组预编译的函数和数据的集合,用于被其他程序调用。库的主要作用是代码重用和模块化,将常用功能封装成库,可以被多个程序共享使用。 1.2 库的类型C语言中主要有两种类型的库: 静态库:在编译时将库代码复制到可执行文件中 动态库:在运行时加载到内存中,被多个程序共享使用 1.3 库的优缺点静态库的优点: 可执行文件不依赖外部库,可独立运行 加载速度快,因为代码已经包含在可执行文件中 编译时可以进行优化,提高性能 静态库的缺点: 可执行文件体积大,因为包含了库代码 库更新后需要重新编译所有使用该库的程序 多个程序使用同一个库时,会在内存中存在多份副本 动态库的优点: 可执行文件体积小,因为不包含库代码 库更新后不需要重新编译使用该库的程序 多个程序使用同一个库时,在内存中只存在一份副本 可以在运行时动态加载和卸载 动态库的缺点: 可执行文件依赖外部库,需要确保库存在 加载速度比静态库慢 编译时的优化空间较小 2. 静态库的创建与使用2.1 静态库的创建2.1.1 编译源文件首先,将源文件编译成目标文件: 12...
第15章 C语言教程 - 高级主题
第15章 高级主题系统函数库系统函数库是操作系统提供的一组函数,用于访问系统资源和服务。在 C 语言中,这些函数通常通过标准头文件提供。 常用系统函数库1. 标准输入/输出库 (<stdio.h>)主要功能: 文件操作、标准输入/输出 常用函数详细说明: 1.1 printf() - 格式化输出到标准输出函数原型: 1int printf(const char *format, ...); 参数说明: 参数 类型 必填 默认值 描述 format const char * 是 无 格式化字符串,包含普通字符和格式说明符 ... 可变参数 否 无 要输出的数据,数量和类型必须与格式说明符匹配 返回值: 成功输出的字符数,失败返回负数 使用场景: 向标准输出(通常是终端)打印格式化信息 注意事项: 格式说明符必须与参数类型匹配,否则会导致未定义行为 格式化字符串中可以包含转义序列,如 \n(换行)、\t(制表符)等 对于字符串参数,确保其以 null 字符结尾 示例: 123printf("Hello, %s!\n&...



