Cprogramming 简明教程
Chain of Pointers in C
What is Chain of Pointers in C?
C 中的 chain of pointers 是一系列相互指向的指针。一个指针变量可以存储另一个变量的地址,该变量可以是任何类型,包括另一个指针,在这种情况下,它被称为 pointer to pointer 。
当存在多级指针时,就是指针链。从理论上讲,可以链接的级别没有限制,如下面示意图所示:
Declaration of Chain of Pointers
这可以通过以下代码表示:
int a = 10;
int *x = &a;
int **y = &x;
int ***z = &y;
在上面的例子中,“x”是一个指向“int”类型的指针,因为符号“int " indicates. To store the address of "x" in "y", it should be a pointer to a pointer to int, i.e., "int * ”。
类似地,“z”是一个指向指向指向 int 的指针的“指针”,因此它的声明中出现了三个星号,即“int * ”。
How Does the Dereferencing Work?
我们知道“*x”返回存储在“x”中的地址的值,即“a”的值。
按照同样的逻辑,“ y" should return its value (refer to the above diagram) which is 1000, which in turn is the address of "a". Hence, the double dereferencing of "y" (i.e., " *y”应该给你“a”的值。
此外,“z”的三次引用“***z”应该给出“a”的值。
Example
以下示例展示了“double dereferencing”和“triple dereferencing”如何工作的:
#include <stdio.h>
int main(){
int a = 10;
int *x = &a;
int **y = &x;
int ***z = &y;
printf("a: %d\n", a);
printf("a: %d\n", *x); // dereferencing x;
printf("a: %d\n", **y); // double dereferencing y;
printf("a: %d\n", ***z); // triple dereferencing z;
return 0;
}
请注意,解除引用的所有这三种情况都打印出“a”的值:
a: 10
a: 10
a: 10
a: 10
Updating the Original Variable by Dereferencing
我们还可以通过解除引用来更新原始 variable 的值。看一看下面的声明:
*x = 11.25;
它将相应地更改“a”的值。类似地,它可以通过后续级别的指针更新。
Example
以下程序展示了如何使用不同级别的解除引用来更新原始变量:
#include <stdio.h>
int main(){
float a = 10.25;;
float *x = &a;
float **y = &x;
float ***z = &y;
printf("a: %f\n", a);
// update with first pointer
*x = 11.25;
printf("a: %f\n", *x);
// update with second pointer
**y = 12.25;
printf("a: %f\n", **y);
// update with third pointer
***z = 13.25;
printf("a: %f\n", ***z);
return 0;
}
运行代码并检查其输出:
a:10.250000
a:11.250000
a:12.250000
a:13.250000
A Chain of Character Pointers
char *a = "Hello";
因此,我们可以创建一个 char 指针链。
Note : 唯一的 difference 是,此处原始变量本身是一个指针,因此高级指针具有 one asterisk more ,与之前的示例相比。
Example
以下示例演示了字符指针链如何工作 −
#include <stdio.h>
int main(){
char *a = "Hello";
char **x = &a;
char ***y = &x;
char ****z = &y;
printf("a: %s\n", a);
printf("a: %s\n", *x);
printf("a: %s\n", **y);
printf("a: %s\n", ***z);
return 0;
}
当你运行这段代码时,它将产生以下输出:
a: Hello
a: Hello
a: Hello
a: Hello
指针链接可用于创建 linked lists 和其他 data structures 。