初始化多级指针指向指针,出现编译错误
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
.
我有这样的指针代码的多级指针:
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
.