初始化多级指针指向指针,出现编译错误

Initialize multi-level pointer to pointer and compile error occurs

我有这样的指针代码的多级指针:

int
main(int argc, char **argv) {
        int a = 1;
        int *pa = &a;
        //int **ppa = &pa; // [Right Code]
        int **ppa = &&a; // [Wrong Code]
        int ***pppa = &ppa;

        *ppa = pa;
        **pppa = pa;
        *pppa = &pa;
}

使用gcc编译时,这一行"int **ppa = &&a;"失败。

⋊> /h/m/stackoverfolw gcc test4.c
test4.c: In function 'main':
test4.c:7:2: error: label 'a' used but not defined
int **ppa = &&a;
^

有人能告诉我我们是否不能将指针初始化为具有值类型和 2 级符号 '&' 的指针?

不,这在 C 和 C++ 中都是不正确的语法。退后一步,想想 address of address 是什么意思。 @sweenish 在现实生活中提供了一个很好的例子。我会诉诸一点组装。

int a = 1;
int *pa = &a;

这转化为在

行上组装一些东西
    mov     DWORD PTR [rbp-12], 1
    lea     rax, [rbp-12]
    mov     QWORD PTR [rbp-8], rax

第一个 mov 指令只是将值 1 分配给 rbp - 12 处的内存,正如人们所猜测的那样,它是对应于 a = 1; 的汇编。 a 的内存地址是 rbp - 12 因为这是用来写入值 1 的地址。下一条指令 lea 本质上意味着 _get rbp - 12 内存中任何内容的地址,可以猜到,它实际上是 rbp - 12! (即 &a 给出的 a 的地址)并将该地址存储在 rax 中。下一条指令只是将 rax 的值移动到 rbp - 8 的内存位置,这对应于设置变量 pa 的值。现在,如果有一些语法来支持像 int **ppa = &&a 这样的语句,这将意味着获取 rbp -12 的值的地址,这没有意义,因为获取实际值的地址没有意义。这有点类似于编写类似于 int *pa = &0xdeadbeef; 的内容。您有一个变量 a,它在内存中的地址 &a(这只是一个普通数字),然后是另一个存储该地址的变量 pa.