我试图理解a是指针时a
和&a
之间的区别。
在以下示例代码中:
int main()
{
int b = 100;
int *a;
a = &b;
printf("%d %d %d", a , &a , *a);
return 0;
}
根据我的理解,a是给a的地址的名称。那是 :
因此,当
a
是指针时,我期望&a
和a
相同。但是在输出中,我得到了前两个值(a
和&a
)不同。我要去哪里错了?
最佳答案
首先,使用%p
并将参数强制转换为void *
以打印指针。为任何转换规范传递不兼容(不匹配)类型的参数是undefined behavior。
也就是说,即使指针变量也是变量,也必须“存储”在地址中。因此,它是指针类型变量的地址。
换一种说法,b
是变量(int
类型),并且具有地址。a
是变量(int *
类型),并且也有一个地址。
要添加一些参考,请引用C11
第6.5.3.2章,
一元&
运算符的操作数应为一个函数指定符,其结果为
[]
或一元*
运算符,或者是一个左值,它指定一个不是位字段并且是
未使用register
存储类说明符声明。
并且,从第6.3.2.1节开始,
左值是一个表达式(对象类型不是void
),它可能
指定一个对象。 [...]