C语言传递指针的指针

  • Post category:C

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

总的来说,使用指针的指针可以实现一些比较灵活的数据结构,比如链表、多维数组等。在实践中要注意指针的指针指向的是指针,因此我们需要牢记每个指针指向的内存地址,防止出现野指针等问题。