Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 变量的地址_C_Pointers - Fatal编程技术网

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”和&

我在C中试验指针的行为。我编写了以下程序:

#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可以定义

地址没有地址。只有内存中的实际变量才有地址。您可以将地址放在指针变量中(如其他答案中所述),指针变量将有一个地址,但指针中的地址值本身并没有自己的地址

地址实际上是“某物所在的位置”。试图找到一个地址的地址就像试图问“我的车在哪里?”


So
char**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)尝试输入地址。“我的车在哪里?”-->“在那里,在那里”;-)