📜  C中的二级指针(1)

📅  最后修改于: 2023-12-03 15:14:25.128000             🧑  作者: Mango

C中的二级指针

在C中,指针是非常核心且有用的概念,可以通过指针来直接获取内存地址,进而可以方便地进行内存控制和操作。除了一级指针,C中还有二级指针,也称为指向指针的指针,它们能够进一步提高代码的灵活性和可读性。

一级指针简介

在C语言中,指针是一种变量,它保存了一个地址,这个地址指向另一个变量的存储位置。一级指针是指它可以指向某个变量的指针,也就是指向一个内存地址的指针。

例如,我们可以定义一个整型变量和一个整型指针变量,并将指针变量指向整型变量的内存地址:

int a = 123;
int *p = &a;

在上面的代码中,变量a的值是123,变量p是一个整型指针变量,保存了变量a的地址。

二级指针简介

二级指针是指指向指针变量的指针,也就是说,它保存了一个指针变量的地址。在实际编程中,我们可以利用二级指针来操作指针数组或动态内存分配等场景。

例如,我们可以定义一个整型指针指针变量,并将其指向指针数组的首地址:

int *arr[10];
int **p = arr;

在上面的代码中,变量arr是一个指针数组,可以存储10个整型指针变量的地址,变量p是一个整型指针指针变量,保存了指针数组arr的首地址。

二级指针的应用
指针数组

二级指针常被用来操作指针数组。指针数组是一组指针类型的数据,既可以用来存储指针,也可以用来存储字符串等数据。我们可以通过指针数组来简化代码的编写,提高程序的可读性和可维护性。

例如,我们可以定义一个指向指针数组的指针,并动态分配内存来存储若干个字符串:

char *strs[] = {"hello", "world", "c", "programming"};
char **p = strs;
int len = sizeof(strs) / sizeof(char *);
for (int i = 0; i < len; i++) {
    printf("%s\n", *p++);
}

在上面的代码中,变量strs是一个包含若干个字符串类型指针的指针数组,变量p是一个指向指针数组strs的指针变量。我们通过sizeof来获取指针数组strs的长度,并在循环中逐一打印每个字符串。

动态内存分配

二级指针还可以用于动态内存分配,例如在使用malloc分配内存时,可以返回一个指向指针的指针从而在函数外部访问内存地址。

例如,我们可以定义一个函数来动态分配内存,并返回一个指向指针的指针:

int **create_matrix(int rows, int cols) {
    int **matrix = (int **) malloc(rows * sizeof(int *));
    for (int i = 0; i < rows; i++) {
        matrix[i] = (int *) malloc(cols * sizeof(int));
    }
    return matrix;
}

在上面的代码中,create_matrix函数接受两个参数rowscols,表示将要创建的矩阵的行数和列数。我们在函数内部使用malloc函数分别为矩阵的每一行和每一列分配内存,并返回一个指向指针的指针变量matrix

总结

在C语言中,指针是非常重要的概念,通过指针我们可以直接操作内存地址,实现高效灵活的代码逻辑。除了一级指针,C语言还有二级指针,也就是指向指针变量的指针。使用二级指针可以进一步提高代码的可读性和可维护性,例如可以用来操作指针数组或动态内存分配等场景。