指向指针的指针(也称为双重指针)是一个指针变量,它存储的是另一个指针变量的地址。在C/C++中,它通常用两个星号表示,如int**
。
指针数组的指针是指向一个数组的指针,而这个数组的每个元素又都是指针。例如int*(*ptr)[10]
表示一个指向包含10个int指针的数组的指针。
int x = 10;
int *p = &x; // 指向int的指针
int **pp = &p; // 指向指针的指针
int *arr[5]; // 指针数组
int *(*ptr_to_arr)[5] = &arr; // 指向指针数组的指针
int **matrix = malloc(rows * sizeof(int*));
for(int i = 0; i < rows; i++) {
matrix[i] = malloc(cols * sizeof(int));
}
void allocateMemory(int **ptr) {
*ptr = malloc(sizeof(int) * 10);
}
int main() {
int *arr;
allocateMemory(&arr); // 传递指针的地址
// 使用arr...
free(arr);
}
char *names[] = {"Alice", "Bob", "Charlie"};
char **name_ptr = names; // 指向指针数组的指针
int x = 10;
int *p = &x;
int **pp = &p;
int ***ppp = &pp;
printf("%d", ***ppp); // 输出10
原因:分配了内存但忘记释放所有层级 解决:
// 释放二维数组
for(int i = 0; i < rows; i++) {
free(matrix[i]);
}
free(matrix);
原因:未初始化指针就解引用 解决:
int **pp = NULL;
if(pp != NULL && *pp != NULL) {
**pp = 10; // 安全访问
}
原因:访问超出分配范围的指针数组 解决:
int *arr[5];
int *(*ptr)[5] = &arr;
// 确保索引在0-4范围内
if(index >= 0 && index < 5) {
(*ptr)[index] = malloc(sizeof(int));
}
原因:将错误的指针类型赋值给双重指针 解决:
int x = 10;
int *p = &x;
// 错误: int **pp = x;
// 正确:
int **pp = &p;
int** createMatrix(int rows, int cols) {
int **matrix = malloc(rows * sizeof(int*));
for(int i = 0; i < rows; i++) {
matrix[i] = calloc(cols, sizeof(int));
}
return matrix;
}
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int main() {
int (*funcs[2])(int, int) = {add, sub};
int (*(*func_ptr)[2])(int, int) = &funcs;
printf("%d\n", (*func_ptr)[0](5, 3)); // 8
printf("%d\n", (*func_ptr)[1](5, 3)); // 2
}
理解指向指针和指针数组的指针对于处理复杂数据结构和动态内存管理至关重要,特别是在需要多级间接访问或构建灵活的数据结构时。
没有搜到相关的文章