You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++双指针(**)的作用、原理及实际应用技术咨询

C++双指针概念与常见问题解答

我正在学习C++中的双指针(**)概念及其实际应用,了解到它可用于动态内存分配、在函数中修改指针值,但仍不清楚其适用场景。相关代码示例如下:

#include <iostream>

void updateValue(int** ptr) {
    **ptr = 50;
}

int main() {
    int value = 10;
    int* ptr = &value;
    int** dptr = &ptr;  // Double pointer

    std::cout << "Before: " << value << std::endl;

    updateValue(dptr);  

    std::cout << "After: " << value << std::endl; // Why does this print 50?

    return 0;
}

技术问询解答

1. 调用updateValue(dptr)为何能修改value变量中存储的值?

这是多层指针解引用的作用:

  • dptr是双指针,存储的是指针ptr的地址;
  • ptr本身存储的是value的内存地址;
  • 函数内的**ptr进行两层解引用:第一层*ptr拿到ptr的内容(也就是value的地址),第二层**ptr直接访问value所在的内存空间,修改这个空间的值自然会同步到主函数的value变量。

2. 使用双指针(int**)与指针引用(int*&)的核心区别是什么?

两者都能实现函数对外部指针状态的修改,但核心差异如下:

  • 本质不同:双指针是独立的指针变量,存的是另一个指针的地址;指针引用是现有指针的别名,和原指针共享同一块内存。
  • 初始化限制不同:引用必须绑定到已存在的指针变量,不能传NULL;双指针可以指向NULL或未初始化的指针地址。
  • 操作灵活性不同:函数内可以给双指针重新赋值,让它指向其他内存;但引用一旦绑定就不能改变绑定对象,只能修改绑定指针指向的内容。
  • 兼容性不同:双指针是C和C通用语法;指针引用是C独有特性,C语言中只能用双指针。

3. 哪些实际开发场景中必须使用双指针?

以下场景通常需要或必须使用双指针:

  • C语言环境下修改指针本身:C没有引用语法,要在函数中让外部指针指向新内存(比如动态分配内存后更新指针),只能通过传递指针的地址(双指针)实现。
  • 管理二维动态数组:动态创建n行m列的数组时,常用int** arr,它指向存储每行指针的数组,每行再指向对应的数据元素。
  • 支持可选指针参数的API:如果函数允许传入NULL作为指针参数(表示无有效指针或无需修改),双指针更合适——因为引用无法绑定NULL。
  • 兼容传统C风格代码:很多遗留C库的API用双指针实现“输出参数”,比如部分文件操作、内存分配函数,必须遵循这种接口设计。

内容的提问来源于stack exchange,提问作者Sourabh Singh Bais

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:52:33