为什么会用到二重指针?

第一种情况:
指针的数组,比如字符串的数组

  1. int *strs[2];
  2. strs[0] = "hello";
  3. strs[1] = "world";

第二种情况:
需要引用语义。C++ 里面有引用参数,用 & 标识,C里面没有,可以用这个实现:

  1. /* 对 a 和 b 做加法,结果存放在 c 里面 */
  2. // C++ 实现
  3. void add(int a, int b, int &c) {
  4. c = a + b;
  5. }
  6. // C 实现
  7. void add(int a, int b, int *c) {
  8. *c = a + b;
  9. }

如何理解二重指针

首先应该明确一个点:只有变量才有地址,字面量没有地址

  1. int a;
  2. int * addr_a = &a; // 可以
  3. int ** a_a_a_1 = &a; // 可以!可以对变量取地址
  4. int ** a_a_a_2 = &(&a); // 不可以!无法对一个字面量取地址!

二重指针有点难以理解,可以利用黑盒思维。比如这段代码:

  1. void foo(char *buf, char **hdr)
  2. {
  3. *hdr = buf;
  4. }

直接看的话很容易迷惑,利用黑盒思维,将某一部分的类型看作一个整体:

  1. typedef char *str_t;
  2. void foo(str_t buf, str_t *hdr)
  3. {
  4. *hdr = buf;
  5. }

这样子就很容易懂了。