C 语言中的指针链
什么是 C 语言中的指针链?
C 语言中的指针链是一系列相互指向的指针。一个指针变量可以存储另一个变量的地址,该变量可以是任何类型的变量,包括另一个指针,在这种情况下,它被称为指向指针的指针。
指针链是指存在多层指针的情况。理论上,链式结构的层数没有限制,如下图所示 -

指针链的声明
可以用以下代码表示 -
int a = 10; int *x = &a; int **y = &x; int ***z = &y;
在上例中,"x"是一个指向"int"类型的指针,正如符号"int *"所示。要将"x"的地址存储在"y"中,它应该是指向int型指针的指针,即"int **"。
类似地,"z"是一个指向int型指针的指针,因此星号在其声明中出现了三次,即"int ***"。
解引用是如何工作的?
我们知道"*x"返回存储在"x"中的地址的值,即"a"的值。
按照同样的逻辑,"*y"应该返回它的值(参见上图),即1000,而这又是"a"的地址。因此,对"y"进行双重解引用(即"**y")应该返回值"a"。
此外,对"z"进行三重解引用(即"***z")应该返回值"a"。
示例
以下示例展示了"双重解引用"和"三重解引用"的工作原理 -
#include <stdio.h> int main(){ int a = 10; int *x = &a; int **y = &x; int ***z = &y; printf("a: %d ", a); printf("a: %d ", *x); // dereferencing x; printf("a: %d ", **y); // double dereferencing y; printf("a: %d ", ***z); // triple dereferencing z; return 0; }
输出
请注意,这三种解引用的情况都会打印"a"的值 -
a: 10 a: 10 a: 10 a: 10
浮点指针链
我们可以按照相同的逻辑创建一个浮点指针链,并应用多层解引用来获取浮点变量的值。
示例
以下示例展示了如何使用浮点指针链 -
#include <stdio.h> int main(){ float a = 10.25; float *x = &a; float **y = &x; float ***z = &y; printf("a: %f ", a); printf("a: %f ", *x); printf("a: %f ", **y); printf("a: %f ", ***z); return 0; }
输出
运行代码并检查其输出 −
a: 10.250000 a: 10.250000 a: 10.250000 a: 10.250000
通过解引用更新原始变量
我们也可以通过解引用来更新原始变量的值。请看以下语句 -
*x = 11.25;
它会相应地更改"a"的值。类似地,可以使用后续级别的指针来更新它。
示例
以下程序展示了如何使用不同级别的解引用来更新原始变量 -
#include <stdio.h> int main(){ float a = 10.25;; float *x = &a; float **y = &x; float ***z = &y; printf("a: %f ", a); // 使用第一个指针更新 *x = 11.25; printf("a: %f ", *x); // 使用第二个指针更新 **y = 12.25; printf("a: %f ", **y); // 使用第三个指针更新 ***z = 13.25; printf("a: %f ", ***z); return 0; }
输出
运行代码并检查其输出 −
a:10.250000 a:11.250000 a:12.250000 a:13.250000
字符指针链
一个字符串表示为一个"char"类型的数组或一个指向"char"类型的指针 -
char *a = "Hello";
因此,我们可以创建一个字符指针链。
注意:唯一的区别是,这里原始变量本身是一个指针,因此与前面的示例相比,上层指针多了一个星号。
示例
以下示例展示了字符指针链的工作原理 -
#include <stdio.h> int main(){ char *a = "Hello"; char **x = &a; char ***y = &x; char ****z = &y; printf("a: %s ", a); printf("a: %s ", *x); printf("a: %s ", **y); printf("a: %s ", ***z); return 0; }
输出
运行此代码时,将产生以下输出 -
a: Hello a: Hello a: Hello a: Hello