C语言中的指针指针(双指针)



什么是C语言中的双指针?

C语言中的**指针指针**,也称为**双指针**,用于存储另一个指针的地址。

C语言中存储另一个变量地址的变量称为**指针**。指针变量可以存储任何类型的地址,包括基本数据类型、数组、结构体类型等。同样,指针也可以存储另一个指针的地址,在这种情况下,它被称为**“指针指针”**(也称为**“双指针”**)。

“指向指针的指针”是一种**多级间接寻址**或**指针链**的形式。通常,指针包含变量的地址。当我们定义“指向指针的指针”时,第一个指针包含第二个指针的地址,第二个指针指向包含实际值的位置,如下所示:

Pointer to Pointer

指针指针的声明

**指针指针**(**双指针**)的声明类似于指针的声明,唯一的区别是需要在指针变量名前使用一个额外的星号(**\***)。

示例

例如,以下声明声明了一个int类型的**指针指针**:

int **var;

当目标值由“指向指针的指针”间接指向时,访问该值需要应用两次星号运算符。

指针指针(双指针)示例

以下示例演示了在C语言中声明、初始化和使用指针指针(双指针)。

#include <stdio.h>

int main() {
  // An integer variable
  int a = 100;

  // Pointer to integer
  int *ptr = &a;

  // Pointer to pointer (double pointer)
  int **dptr = &ptr;

  printf("Value of 'a' is : %d\n", a);
  printf("Value of 'a' using pointer (ptr) is : %d\n", *ptr);
  printf("Value of 'a' using double pointer (dptr) is : %d\n", **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。下图显示了可视化描述:

Normal Pointer

让我们声明一个指向int类型的指针,并将int变量的地址存储在其中。

int a = 10;
int *b = &a;

**解引用运算符**通过指针获取值。

printf("a: %d \nPointer to 'a' is 'b': %d \nValue at 'b': %d", a, b, *b);

示例

这是一个完整的程序,显示了普通指针是如何工作的:

#include <stdio.h>

int main(){

   int a = 10;
   int *b = &a;
   printf("a: %d \nPointer to 'a' is 'b': %d \nValue at 'b': %d", a, b, *b);

   return 0;
}

输出

它将打印int变量的值、它的地址以及通过解引用指针获得的值:

a: 10 
Pointer to 'a' is 'b': 6422036 
Value at 'b': 10

双指针是如何工作的?

现在让我们声明一个可以存储“b”地址的指针,“b”本身是指向int类型的指针,写成**“int \*”**。

让我们假设编译器也为它分配地址3000。

Double Pointer

因此,**“c”**是指向int类型的指针的指针,应该声明为**“int \*\*”**。

int **c = &b;
printf("b: %d \nPointer to 'b' is 'c': %d \nValue at b: %d\n", 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 \nAddress of 'a': %d \nValue at a: %d\n\n", a, b, *b);

   int **c = &b;
   printf("b: %d \nPointer to 'b' is c: %d \nValue at b: %d\n", 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语言中的“指针指针”或“双指针”的行为就像普通指针一样。因此,双指针变量的大小始终等于普通指针。

我们可以通过对上述程序中的指针“b”和“c”应用**sizeof运算符**来检查它:

printf("Size of b - a normal pointer: %d\n", sizeof(b));
printf("Size of c - a double pointer: %d\n", sizeof(c));

这显示了两个指针的大小相等:

Size of b - a normal pointer: 8
Size of c - a double pointer: 8

**注意:**上述示例中显示的不同指针变量的大小和地址可能会有所不同,因为它取决于诸如CPU架构和操作系统之类的因素。但是,它们将显示一致的结果。

C语言中的多级指针(三级指针可能吗?)

理论上,指针声明中出现的星号数量没有限制。

如果您确实需要指向**“c”**(在上例中),它将是“指向指向指针的指针”,可以声明为:

int ***d = &c;

通常,双指针用于引用二维数组或字符串数组。

广告
© . All rights reserved.