为什么会用到二重指针?
第一种情况:
指针的数组,比如字符串的数组
int *strs[2];
strs[0] = "hello";
strs[1] = "world";
第二种情况:
需要引用语义。C++ 里面有引用参数,用 &
标识,C里面没有,可以用这个实现:
/* 对 a 和 b 做加法,结果存放在 c 里面 */
// C++ 实现
void add(int a, int b, int &c) {
c = a + b;
}
// C 实现
void add(int a, int b, int *c) {
*c = a + b;
}
如何理解二重指针
首先应该明确一个点:只有变量才有地址,字面量没有地址
int a;
int * addr_a = &a; // 可以
int ** a_a_a_1 = &a; // 可以!可以对变量取地址
int ** a_a_a_2 = &(&a); // 不可以!无法对一个字面量取地址!
二重指针有点难以理解,可以利用黑盒思维。比如这段代码:
void foo(char *buf, char **hdr)
{
*hdr = buf;
}
直接看的话很容易迷惑,利用黑盒思维,将某一部分的类型看作一个整体:
typedef char *str_t;
void foo(str_t buf, str_t *hdr)
{
*hdr = buf;
}
这样子就很容易懂了。