如何理解二级指针?为何调用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这个指针变量本身的内存地址。
对二级指针的操作:
*pp:解引用二级指针,得到它指向的一级指针p。**pp:再解引用一次,得到p指向的实际数据(比如字符'h')。
二级指针的常见用途:
- 在函数中修改外部一级指针的值(就像方案1中
fun可以修改b的指向)。 - 管理指针数组(比如存储多个字符串的数组:
const char* arr[] = {"apple", "banana"}; const char** pp = arr;)。
内容的提问来源于stack exchange,提问作者Yeatsflee
相关产品推荐
相关产品推荐

