首页 > 编程笔记 > C语言笔记

C语言指向指针的指针(附带示例)

在C语言中,“指向指针的指针”又叫二级指针,它们只是一个概念的不同称呼而已。简单来说,“指向指针的指针”也是一个指针,它指向另一个指针变量。
 

普通指针存储的是某个变量的内存地址,而指向指针的指针则是存储另一个指针变量的地址。这样,我们就创建了一个额外的间接寻址层次。


在C语言中,我们使用双星号**来声明一个指向指针的指针,它的语法格式如下:

数据类型 **指针名;

举个例子,让我们声明一个指向整型指针的指针:

int **ptr;

在这个声明中,ptr 是一个指针,它指向的是一个 int* 类型的指针,而这个 int* 类型的指针又指向一个 int 类型的数据。换句话说,ptr 存储的是另一个指针的地址,而那个指针又指向一个整数。


为了更好地理解这个概念,我们来看一个具体的例子:

#include <stdio.h>

int main() {
    int value = 42;
    int *ptr1 = &value;
    int **ptr2 = &ptr1;

    printf("Value: %d\n", value);
    printf("Value via ptr1: %d\n", *ptr1);
    printf("Value via ptr2: %d\n", **ptr2);

    return 0;
}

输出结果:

Value: 42
Value via ptr1: 42
Value via ptr2: 42

在这个例子中,我们首先创建了一个整数变量 value,然后创建了一个指向这个整数的指针 ptr1。接着,我们创建了一个指向 ptr1 的指针 ptr2。通过使用 *ptr1,我们可以访问 value 的值;而通过使用 **ptr2,我们可以通过两层间接引用来访问 value 的值。
 

指向指针的指针在处理多维数组、动态内存分配以及复杂的数据结构时非常有用。例如,在创建动态的二维数组时,我们经常会用到这个概念:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int rows = 3, cols = 4;
    int **matrix;

    // 分配内存
    matrix = (int **)malloc(rows * sizeof(int *));
    for (int i = 0; i < rows; i++) {
        matrix[i] = (int *)malloc(cols * sizeof(int));
    }

    // 初始化矩阵
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            matrix[i][j] = i * cols + j;
        }
    }

    // 打印矩阵
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%2d ", matrix[i][j]);
        }
        printf("\n");
    }

    // 释放内存
    for (int i = 0; i < rows; i++) {
        free(matrix[i]);
    }
    free(matrix);

    return 0;
}

在这个例子中,我们使用指向指针的指针来创建一个动态的二维数组。matrix 是一个指向指针的指针,它指向一个指针数组,而每个指针又指向一行整数。
 

在使用指向指针的指针时,有一些注意事项需要牢记:

相关文章