我试图理解a是指针时a&a之间的区别。

在以下示例代码中:

int main()
{
    int b = 100;
    int *a;
    a = &b;
    printf("%d %d %d", a , &a , *a);
    return 0;
}


根据我的理解,a是给a的地址的名称。那是 :

c - ,&a和* a有什么区别?-LMLPHP

因此,当a是指针时,我期望&aa相同。但是在输出中,我得到了前两个值(a&a)不同。

我要去哪里错了?

最佳答案

首先,使用%p并将参数强制转换为void *以打印指针。为任何转换规范传递不兼容(不匹配)类型的参数是undefined behavior

也就是说,即使指针变量也是变量,也必须“存储”在地址中。因此,它是指针类型变量的地址。

换一种说法,


b是变量(int类型),并且具有地址。
a是变量(int *类型),并且也有一个地址。




要添加一些参考,请引用C11第6.5.3.2章,


  一元&运算符的操作数应为一个函数指定符,其结果为
  []或一元*运算符,或者是一个左值,它指定一个不是位字段并且是
  未使用register存储类说明符声明。


并且,从第6.3.2.1节开始,


  左值是一个表达式(对象类型不是void),它可能
  指定一个对象。 [...]

09-10 01:26