一、指针 (Pointer)
1. 指针的概念
- 看个屁的概念
2. 指针的基本操作:寻址和取值
-
&
(取址运算符): 获取存储址,返回变量在内存中的起始位置。iniint a = 10; int *pa = &a; // pa 存储了变量 a 的内存地址 `&a` 运算的结果就是变量 `a` 在内存中的地址。
-
*
(声明指针变量): 在声明变量时,*
表明你声明的是一个指针变量,它用来存储内存地址。 -
*
(解引用运算符): 访问指针所指向的内存地址中的值。cint a = 10; int *pa = &a; std::cout << *pa << std::endl; // 输出 10,即 pa 指向的内存地址中存储的值
3. 指针的初始化和空指针:避免野指针
nullptr
是空指针常量,表示指针不指向任何有效的内存地址。
将指针初始化为 nullptr
是一种良好的编程习惯。
go
int *pp = nullptr;` 明确地表示指针 `pp` 当前没有指向任何有效的 `int` 型变量。
- 检查空指针:
在使用指针之前,检查指针是否为 nullptr
,以避免访问无效内存。
c
int *ptr = get_some_pointer(); // 假设 get_some_pointer 可能返回 nullptr
if (ptr != nullptr) {
// 指针有效,可以安全使用
std::cout << *ptr << std::endl;
} else {
// 指针为空,处理错误情况
std::cout << "指针为空!" << std::endl;
}
4. 多级指针:指向指针的指针
-
二级指针: 指向指针的指针。
iniint a = 10; int *pp = &a; // pp 指向 a 的地址 int **pp2 = &pp; // pp2 指向 pp 的地址 `pp2` 存储的是指针 `pp` 的内存地址。
-
三级指针: 指向二级指针的指针。
iniint ***pp3 = &pp2;
5. void
指针:通用的指针
- 可以指向任何类型:
void *
是一种特殊的指针类型,它可以指向任何类型的变量的内存地址。
ini
int n = 10;
float f = 3.14;
void *vp;
vp = &n; // void 指针可以指向 int
vp = &f; // void 指针也可以指向 float
-
不能直接解引用: 由于
void
指针不知道它指向的数据类型,因此不能直接使用*
解引用。需要先将其强制转换为具体的指针类型才能访问其指向的值。cint n = 10; void *vp = &n; int *ip = static_cast<int*>(vp); // 强制转换为 int* std::cout << *ip << std::endl; // 现在可以解引用了
-
void
作为函数返回类型: 表示函数不返回任何值。这与void
指针是不同的概念。