C语言中传递指针的指针,在函数中可以修改指向指针的指针所指向的地址,从而可以修改指针的值,达到间接修改指针指向的变量的目的。
具体来说,我们可以声明一个双指针变量,如下所示:
int **pptr;
然后我们可以通过取地址操作,将一个普通指针的地址赋给双指针变量:
int *ptr;
int n = 10;
ptr = &n;
pptr = &ptr;
此时,我们可以通过访问指针的地址,即通过双指针变量pptr,间接访问n的值。
接下来,我们看一个示例,演示如何在函数中传递指针的指针,实现间接修改指针指向变量的值。
示例1:
#include <stdio.h>
void change_val(int **pptr) {
int n = 20;
*pptr = &n;
}
int main() {
int *ptr;
int n = 10;
ptr = &n;
printf("ptr points to value %d before change_val\n", *ptr);
change_val(&ptr);
printf("ptr points to value %d after change_val\n", *ptr);
return 0;
}
在这个示例中,我们定义了函数change_val,它的参数是指针的指针pptr。在函数中,我们声明一个整型变量n,并将它的地址赋给pptr指向的地址。这样,由于我们在函数中间接修改了指针ptr指向的内存地址,因此在函数外部也可以看到修改后的值。
输出结果如下:
ptr points to value 10 before change_val
ptr points to value 20 after change_val
再看一个示例,演示如何使用指针的指针数组。
示例2:
#include <stdio.h>
void print_matrix(int **matrix, int n, int m) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
}
int main() {
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int *p[3] = {matrix[0], matrix[1], matrix[2]};
print_matrix(p, 3, 4);
return 0;
}
在这个示例中,我们定义了一个3×4的二维数组matrix,然后声明一个指针的指针数组p,将matrix的每一行的地址分别赋给数组中的元素。
接着我们定义了一个print_matrix函数,它的参数是指针的指针数组和行列数。在函数中,我们使用指针的指针访问矩阵的元素。由于我们在main函数中使用指针的指针将matrix的每一行的地址赋给了p数组的元素,因此在函数中我们可以通过p指针的指针访问到matrix中的元素。
输出结果如下:
1 2 3 4
5 6 7 8
9 10 11 12
总的来说,使用指针的指针可以实现一些比较灵活的数据结构,比如链表、多维数组等。在实践中要注意指针的指针指向的是指针,因此我们需要牢记每个指针指向的内存地址,防止出现野指针等问题。