C 语言中的指向指针(双精度指针)
C 语言中的双精度指针是什么?
C 语言中,指向指针的指针(也称为双精度指针)用于存储另一个指针的地址。
C 语言中,用于存储另一个变量地址的变量被称为指针。指针变量可以存储任何类型的地址,包括基本数据类型、数组、结构体类型等。同样,指针也可以存储另一个指针的地址,在这种情况下,它被称为"指向指针的指针"(也称为"双精度指针")。指针")。
"指向指针的指针"是一种多重间接或指针链的形式。通常,指针包含变量的地址。当我们定义一个"指向指针的指针"时,第一个指针包含第二个指针的地址,该指针指向包含实际值的位置,如下所示 -

指向指针的指针的声明
指向指针的指针(双精度指针)的声明与指针的声明类似,唯一的区别是需要在指针变量名称前使用额外的星号(*)。
示例
例如,以下声明声明了一个类型为int
的"指向指针的指针"int **var;
当"指向指针的指针"间接指向目标值时,访问该值需要使用两次星号运算符。
指向指针的指针(双精度指针)示例
以下示例演示了在 C 语言中声明、初始化和使用指向指针的指针(双精度指针):
#include <stdio.h> int main() { // 一个整型变量 int a = 100; // 指向整数的指针 int *ptr = &a; // 指向指针的指针(双精度指针) int **dptr = &ptr; printf("Value of 'a' is : %d ", a); printf("Value of 'a' using pointer (ptr) is : %d ", *ptr); printf("Value of 'a' using double pointer (dptr) is : %d ", **dptr); return 0; }
输出
Value of 'a' is : 100 Value of 'a' using pointer (ptr) is : 100 Value of 'a' using double pointer (dptr) is : 100
C 语言中普通指针是如何工作的?
假设一个整型变量 "a" 位于任意地址 1000。它的指针变量为 "b",编译器为其分配地址 2000。下图直观地展示了该过程:

声明一个指向 int 类型的指针,并将一个 int 变量的地址存储在其中。
int a = 10; int *b = &a;
解引用运算符 通过指针获取值。
printf("a: %d Pointer to 'a' is 'b': %d Value at 'b': %d", a, b, *b);
示例
以下是完整的程序,展示了普通指针的工作原理 -
#include <stdio.h> int main(){ int a = 10; int *b = &a; printf("a: %d Pointer to 'a' is 'b': %d Value at 'b': %d", a, b, *b); return 0; }
输出
它将打印int变量的值、其地址以及通过取消引用指针获得的值−
a: 10 Pointer to 'a' is 'b': 6422036 Value at 'b': 10
双指针如何工作?
现在声明一个可以存储"b"地址的指针,该指针本身是一个指向int类型的指针,写为"int *"。
假设编译器也为其分配了地址 3000。

因此,"c"是一个指向int指针的指针,应该声明为"int **"。
int **c = &b; printf("b: %d Pointer to 'b' is 'c': %d Value at b: %d ", b, c, *c);
您将获得"b"的值(即"a"的地址)、"c"的值(即"b:"的地址)以及"c"的取消引用值(即"a"的地址)-
b: 6422036 Pointer to b is c: 6422024 Value at b: 6422036
此处,"c"是一个双精度指针。其声明中的第一个星号指向"b",而第二个星号又指向"a"。因此,我们可以使用双精度引用指针从"c"获取"a"的值。
printf("Value of 'a' from 'c': %d", **c);
这应该显示"a"的值是10。
示例
以下是完整的程序,展示了双指针的工作原理 -
#include <stdio.h> int main(){ int a = 10; int *b = &a; printf("a: %d Address of 'a': %d Value at a: %d ", a, b, *b); int **c = &b; printf("b: %d Pointer to 'b' is c: %d Value at b: %d ", b, c, *c); printf("Value of 'a' from 'c': %d", **c); return 0; }
输出
运行代码并检查其输出 −
a: 10 Address of 'a': 1603495332 Value at a: 10 b: 1603495332 Pointer to 'b' is c: 1603495336 Value at b: 1603495332 Value of 'a' from 'c': 10
双精度指针的行为与普通指针相同
C 语言中的"指向指针的指针"或"双精度指针"的行为与普通指针相同。因此,双精度指针变量的大小始终等于普通指针。
我们可以通过将 sizeof 运算符 应用于上述程序中的指针"b"和"c"来验证这一点 -
printf("Size of b - a normal pointer: %d ", sizeof(b)); printf("Size of c - a double pointer: %d ", sizeof(c));
这显示两个指针的大小相等 -
Size of b - a normal pointer: 8 Size of c - a double pointer: 8
注意: 以上示例中不同指针变量的大小和地址可能会有所不同,这取决于 CPU 架构和操作系统等因素。但是,它们显示的结果一致。
C 语言中的多级指针(可以使用三重指针吗?)
理论上,指针声明中星号的数量没有限制。
如果您确实需要一个指向 "c" 的指针(在上例中),它将是一个"指向指向指针的指针的指针",并且可以声明为 -
int ***d = &c;
双指针通常用于引用二维数组或字符串数组。