C 双重指针 (指向指针的指针)

2025 年 9 月 6 日 | 7 分钟阅读

在 C 编程语言中,双重指针是用于存储另一个指针的地址的指针。第一个指针用于存储变量的地址,第二个指针用于存储第一个指针的地址。因此,双重指针也称为指向指针的指针。它常用于 动态内存分配、将指针传递给函数以及管理 多维数组

pointer to pointer in c

语法

它具有以下语法:

在这个语法中,

  • 数据类型:表示数据的类型。
  • 指针名称:表示指针的名称。

C 编程中,双重指针的声明与指针的声明类似。指针和双重指针的主要区别在于我们在指针变量名前使用额外的星号 (*)。

C 双重指针示例

让我们举一个例子来说明 C 编程中的双重指针。

示例

编译并运行

输出

address of a: d26a8734
address of p: d26a8738
value stored at p: 10
value stored at pp: 10

说明

在此示例中,我们演示了 C 中双重指针的概念。这里,我们有一个指针 p,它存储变量 a 的地址,而双重指针 pp 存储指针 p 的地址。使用 *p 给出 a 的值 (10),而 **pp 也通过两次解引用来访问相同的值,这表明双重指针如何间接引用数据。

C 中双重指针的另一个示例

让我们再举一个例子来说明 C 中的双重指针。

示例

编译并运行

输出

Address of number variable is fff4
Address of p variable is fff4
Value of *p variable is 50
Address of p2 variable is fff2
Value of **p variable is 50

说明

在此示例中,我们初始化了一个整数变量 number,其值为 50,然后我们初始化了一个整数类型的指针变量 p 和一个双重指针变量 p2。指针 p 存储整数变量 number 的地址,双重指针存储指针 p 的地址。之后,它打印 p 指针的地址值,*p 指针变量的值,然后打印 p2 变量的地址值,最后打印双重指针 p 处的值。

注意:双重指针的行为与普通指针类似,因此双重指针的大小始终等于普通指针的大小,即根据操作系统和 CPU 架构而定。这意味着对于 64 位系统,大小为 8 字节,对于 32 位系统,大小为 4 字节。

C 中双重指针的用途

C 中的双重指针有多种用途。C 中双重指针的一些主要用途如下:

  • 它用于存储多层次数据,例如文本文档段落和词语语义。
  • 我们可以使用双重指针作为方法参数来操作存储在局部指针变量中的地址。
  • 它还用于动态内存中存储多维数组。
  • 它们也可以用于数据结构,无需复制即可更改节点的地址。

C 中带指针数组的双重指针

让我们举一个例子来说明 C 编程中带指针数组的双重指针。

示例

编译并运行

输出

1 1 206
2 2 300
2 3 409
2 3 410 

说明

在此示例中,我们演示了双重指针与指针数组的结合使用。这里,我们有一个包含整数值的数组 'a',p 存储 a 中每个元素的地址。之后,双重指针 pp 最初指向 p,并实现指针算术 (pp++, *pp++, ++*pp, ++**pp) 来遍历和操作指针以及实际的数组值。最后,printf 函数逐步显示 pp 的位置、相对于基数组 a 的偏移量以及解引用的值如何变化。

使用动态内存分配的双重指针

在 C 编程语言中,双重指针可以与 malloc()calloc() 和 free() 函数一起使用,为函数内的指针分配内存。

使用动态内存分配的 C 双重指针示例

让我们举一个例子来说明使用动态内存分配的 C 中的双重指针。

示例

编译并运行

输出

2D Array: 
2 3 4 
5 6 7

结论

总之,C 中的双重指针是一项重要功能,可帮助我们处理指向指针的指针。它在多种情况下非常有用,例如二维数组的动态内存分配、将引用传递给函数、处理数据结构等等。它们还提供了处理 C 中内存的高度灵活性。但是,我们应该使用双重指针来避免内存泄漏和悬空指针等错误。它有助于使程序更具动态性和效率。

C 双重指针常见问题解答

1) C 编程中指针和双重指针有什么区别?

在 C 编程中,指针和双重指针的主要区别在于,单个指针 (*) 指向单个变量,而双重指针 (**) 指向另一个指针。

2) 如何在 C 中打印双重指针指向的值?

如果我们想打印双重指针指向的值,我们可以使用 printf 语句并打印 **ptr 的值。这里,第一个 * 提供存储在单个指针中的地址,第二个 * 访问存储在该地址的值。

3) C 中双重指针的用例是什么?

双重指针常用的以下用例或场景:

  • 它用于管理链表或其他复杂数据结构。
  • 它用于为二维数组分配动态内存。
  • 它用于将指向指针的指针传递给函数,从而允许函数修改指针本身。

4) 我们可以将双重指针传递给函数吗?

是的,我们可以将双重指针传递给函数。它允许函数修改指针本身。

5) 如果我们在 C 中解引用 NULL 双重指针会发生什么?

当我们解引用 NULL 双重指针时,它将导致未定义的行为。它通常会导致段错误。因此,在解引用之前,我们应始终确保指针不是 NULL。


下一个主题C 中的指针算术