双重指针(double pointer),是指一个指针的值是另一个指针的地址。在 C 和 C++ 中,这种指针用于实现更复杂的数据结构和内存管理。
基本概念
- 指针:指向某个数据类型的变量。例如,int *p 是一个指向 int 的指针,p 存储的是一个 int 类型变量的地址。
- 指向指针的指针:是指向指针的指针。它的声明为 int **pp,其中 pp 是一个指向 int * 的指针。也就是说,pp 的值是另一个 int * 指针的地址。
示例
#include
#include
void allocate(int **pp) {
*pp = malloc(sizeof(int)); // 分配内存并将地址赋值给指针
if (*pp == NULL) {
fprintf(stderr, "Memory allocation failed\n");
exit(1);
}
**pp = 42; // 赋值 42 到新分配的内存
}
int main() {
int *p = NULL; // 初始化指针为 NULL
allocate(&p); // 将 p 的地址传递给 allocate 函数
printf("%d\n", *p); // 输出 42
free(p); // 释放内存
return 0;
}
在这个示例中:
- allocate 函数:
- int **pp 是一个指向指针的指针。
- 当我们调用 allocate(&p) 时,我们实际上将 p 的地址传递给 allocate,这意味着 pp 在 allocate 内部指向 p。
- 使用 *pp = malloc(sizeof(int)); 我们分配了内存,并把分配的内存地址赋给 p。
- 使用双重指针的原因:
- 允许函数修改指针的值。例如,可以在函数中动态分配内存并将其地址返回给调用者。
- 在处理动态数组或二维数组等复杂数据结构时,双重指针也非常有用。
总结
指向指针的指针是一个非常强大的工具,允许函数以引用的方式修改指针,并在动态内存管理中提供灵活性。