前言:指针是C语言中一个复杂但强大的概念,它提供了直接访问内存的能力,使得程序员能够高效地操作和管理数据。本博客旨在系统地梳理指针相关的知识点,并通过具体的例子加深理解。
指针知识导图
│
├── 指针基础
│ ├── 内存和地址
│ ├── 指针变量和地址
│ ├── 指针变量类型的意义
│ ├── const修饰指针
│ ├── 指针运算
│ ├── 野指针
│ ├── assert断言
│ └── 指针的使用和传址调用
│
├── 指针进阶
│ ├── 数组名的理解
│ ├── 使用指针访问数组
│ ├── 一维数组传参的本质
│ ├── 冒泡排序(通过指针实现)
│ ├── 二级指针
│ ├── 指针数组
│ └── 指针数组模拟二维数组
│
├── 指针与数据结构
│ ├── 字符指针变量
│ ├── 数组指针变量
│ ├── 二维数组传参的本质
│ ├── 函数指针变量
│ ├── 函数指针数组
│ └── 转移表
│
├── 指针高级应用
│ ├── 回调函数
│ ├── qsort使用举例
│ └── qsort函数的模拟实现
│
└── 指针相关的笔试题解析
├── sizeof和strlen的对比
├── 数组和指针笔试题解析
└── 指针运算笔试题解析
第一部分:指针基础
1. 内存和地址
计算机的内存可以被视为一系列连续的存储单元,每个单元都有一个唯一的地址。程序中的每个变量都存储在内存的某个位置,通过地址可以访问这些位置。
2. 指针变量和地址
指针变量是存储内存地址的变量。例如,int *p;
声明了一个指向整型数据的指针变量p,
这部分内容同时包含了取地址操作符(&)解引用操作符(*)的学习。
3. 指针变量类型的意义
指针类型定义了指针所指向的变量类型,这决定了指针的运算和间接访问操作。
这部分还包括了,指针变量的大小和指针和整数之间的运算。在一些场合中还能遇见void*指针。
4. const修饰指针
const
可以用来修饰指针和指针所指向的数据,防止数据被意外修改。
5. 指针运算
指针支持加减运算,这些运算基于指针所指向的数据类型的大小进行。可以有指针和整数,指针和指针之间的运算。
6. 野指针
未初始化的指针称为野指针,它们可能指向任何位置,使用它们可能导致不可预测的行为,因此要学会识别和避免野指针的出现和使用。
7. assert断言
assert
是一种调试辅助工具,在assert.h头文件下工作,用于在运行时检查假设是否为真,是一种有效的错误检测方法。
8. 指针的使用和传址调用
这个部分将了解到strlen的模拟使用。
对于传址调用:通过指针,函数可以直接修改传入的参数值,这称为传址调用。
第二部分:指针进阶
1. 数组名的理解
数组名在大多数情况下代表数组的起始地址,但在sizeof和&数组名这两种特殊情况下除外。
2. 使用指针访问数组
通过指针运算,可以遍历数组元素,这比使用数组下标更灵活。
3. 一维数组传参的本质
向函数传递一维数组时,实际上传递的是数组的起始地址。
4. 冒泡排序
冒泡排序算法可以通过指针实现,通过交换指针所指向的元素来排序数组。
5. 二级指针
二级指针是指向指针的指针,它可以用来动态管理指针数组或多级间接引用。
6. 指针数组
指针数组是数组,其元素是指针。它常用于存储字符串数组或动态分配的数组列表。
7. 指针数组模拟二维数组
通过指针数组,可以灵活地模拟二维数组的行为,允许每行有不同的长度。
第三部分:指针与数据结构
1. 字符指针变量
字符指针变量常用于处理字符串,例如char *str = "Hello";
。
2. 数组指针变量
数组指针是指向数组的指针,例如int (*p)[5];
是指向含有5个整数的数组的指针。
3. 二维数组传参的本质
向函数传递二维数组时,通常传递的是指向数组第一行的指针。
4. 函数指针变量
函数指针是指向函数的指针,可以用于回调函数和函数的动态调用。
5. 函数指针数组
函数指针数组是存储多个函数指针的数组,常用于实现转移表等技术。
6. 转移表
转移表是一种使用函数指针数组实现的决策表,用于根据条件动态调用不同的函数。
第四部分:指针高级应用
1. 回调函数是什么?
回调函数是由其他函数(高阶函数)调用的函数,通常通过函数指针传递给高阶函数。
2. qsort使用举例
qsort
是C标准库中的快速排序函数,它使用函数指针作为比较函数参数。
3. qsort函数的模拟实现
理解qsort
的内部实现可以加深对指针和函数指针的理解。
第五部分:指针相关的笔试题解析
1. sizeof和strlen的对比
sizeof
是编译时操作,返回类型或变量的大小;strlen
是运行时函数,返回字符串的长度。
2. 数组和指针笔试题解析
许多笔试题目旨在测试对数组和指针关系的理解,特别是它们在参数传递中的行为。
3. 指针运算笔试题解析
指针运算题目测试对指针加减、比较等操作的理解,这些是指针操作中的基本技能。