C 变量的地址
我在C中试验指针的行为。我编写了以下程序:C 变量的地址,c,pointers,C,Pointers,我在C中试验指针的行为。我编写了以下程序: #include <stdio.h> main(){ int a = 1; printf("%p\n", &&a); } #包括 main(){ INTA=1; printf(“%p\n”和&a); } 我知道这个程序会出错。因为地址的地址是不明确的,这将变得非常递归。但是当我试图编译程序时,它给出了一个我无法理解的错误 错误:已使用标签“a”,但未定义 printf(“%p\n”和&
#include <stdio.h>
main(){
int a = 1;
printf("%p\n", &&a);
}
#包括
main(){
INTA=1;
printf(“%p\n”和&a);
}
我知道这个程序会出错。因为地址的地址是不明确的,这将变得非常递归。但是当我试图编译程序时,它给出了一个我无法理解的错误
错误:已使用标签“a”,但未定义
printf(“%p\n”和&a)
使用但未定义的标签“a”是什么意思?
&
是真正的gcc
扩展,但不适用于变量。它是为标签设计的
和&a
用于
在您的例子中,编译器推断出
a
,后跟&
运算符,是标签
,但您的代码中没有定义任何标签
a
,因此这就是错误。您不允许获取地址运算符返回的临时值的地址。&&是一个gcc扩展:
&只是为了获取内存框的地址,尝试使用指针
这并不是对你问题的直接回答。阅读这本书的人更多的是想知道为什么当
char**ptr代码>可以定义
地址没有地址。只有内存中的实际变量才有地址。您可以将地址放在指针变量中(如其他答案中所述),指针变量将有一个地址,但指针中的地址值本身并没有自己的地址
地址实际上是“某物所在的位置”。试图找到一个地址的地址就像试图问“我的车在哪里?”
Sochar**ptr
不是地址的地址,它是一个包含指针变量地址的变量。这很符合逻辑,因为地址不是内存中某个物理位置的东西,所以它不能拥有地址本身。这就是为什么&&
运算符可以用于其他目的的原因
如果你尝试
int x ;
printf("%d\n", &x); // valid
printf("%d\n", &(&x)); // error lvalue required as the address is not the object
“我在试验C语言中指针的行为”不要这样做,那不会教你任何有用的东西。读一本好书;最好不是90年代的main
没有返回类型时使用的合法地址。您无法获取int a
的地址,因为&a
甚至可能不在内存中-它可能在寄存器中。我知道我无法获取地址的地址。我的问题是关于给出的错误。使用但未定义的标签“a”的含义是什么?因为a
是一个变量,而不是标签(GCC扩展名)?使用printf(“%p\n”,&&a)代码>尝试输入地址。“我的车在哪里?”-->“在那里,在那里”;-)