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

如何理解二级指针?为何调用fun函数时方案1可行、方案2不可行?

二级指针问题解答

一、为什么方案1可行,方案2无法运行?

先看函数签名:void fun(const char** a),它接收一个指向const char*类型指针的指针作为参数。

  • 方案1的代码:

    const char* b = nullptr;
    fun(&b);
    

    这里b是一个const char*类型的变量,&b取的是b在内存中的地址,类型正好是const char**,和函数参数完全匹配。而且&b是一个有效的内存地址(指向栈上的b变量),所以如果fun内部对*a进行操作(比如给*a赋值新的字符串地址),本质是修改b的值,这完全合法,不会出现运行错误。

  • 方案2的代码:

    const char** b = nullptr;
    fun(b);
    

    这里b本身是一个二级指针,但它被初始化为nullptr(空指针)。虽然类型和函数参数匹配,但如果fun内部尝试操作*a(也就是解引用b),就会对空指针进行访问——这是C++中的未定义行为,会直接导致程序崩溃,所以方案2无法正常运行。

核心差异:方案1传递的是指向合法变量的有效二级指针,方案2传递的是空的二级指针,函数内部操作时触发了内存访问错误。

二、如何理解二级指针?

二级指针可以简单理解为「指针的地址」,它本质还是一个指针变量,只不过它指向的不是普通数据,而是另一个指针变量。

用层级拆解的方式理解:

  • 一级指针const char* p:存储的是某块数据(比如字符串)的首地址,比如p = "hello";,p指向的是字符'h'的内存地址。
  • 二级指针const char** pp:存储的是一个const char*类型指针的地址,比如pp = &p;,pp指向的是p这个指针变量本身的内存地址。

对二级指针的操作:

  1. *pp:解引用二级指针,得到它指向的一级指针p。
  2. **pp:再解引用一次,得到p指向的实际数据(比如字符'h')。

二级指针的常见用途:

  • 在函数中修改外部一级指针的值(就像方案1中fun可以修改b的指向)。
  • 管理指针数组(比如存储多个字符串的数组:const char* arr[] = {"apple", "banana"}; const char** pp = arr;)。

内容的提问来源于stack exchange,提问作者Yeatsflee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:45:33