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

