2017-08-10 193 views
-3

我试图了解当a是指针时a&a之间的差异。a,&a和* a有什么区别?

在下面的示例代码

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

根据我的理解,一个是给的地址的。那就是:

enter image description here

所以我期待a&a是相同的,当a是一个指针。但在输出中,我得到的前两个值(a&a)不同。

我哪里错了?

+1

*根据我的理解,'a'是给a'地址的名字。*这是一个误解。 'a'是代表特定地址的值的名称。所以使用'a'你可以访问这个值。使用'&a'可以访问由'a'表示的值的地址。然后'* a'假设'a'表示的值本身就是一个地址,'* a'表示该地址的值。 – lurker

回答

5

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

这就是说,即使是一个指针变量,也是一个变量,必须“存储”在一个地址中。所以,这是一个指针类型变量的地址。

换句话说,

  • b是(类型int的)变量中,并有一个地址。
  • a是一个变量(类型int *),它也有也有有一个地址。

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

一元&操作者的操作数应是一个功能指示器,一个 []或的结果一元运算符*运算符或指定不是位字段的对象的左值,并且 未用register存储类说明符声明。

和,从§6.3.2.1,

左值是潜在 指定的一个对象中的表达(与除void其他的对象类型)。 [...]

+0

因此,在上图中,* a = 100,&a = 0x77e4和a = 0x867f。那是对的吗 ? –

+0

@SeverusTux确切的说,是的。 –

1

其可能更容易地通过下面的简单的代码为例进行说明:

的printf( “%d%d%d%d%d”,& A,A,*一个,& b ,b);

返回例如:

290289632 290289644 100 290289644 100 
  • 的地址:&一个是在启动时分配的东西(输出项 1)。
  • a指向b的地址,因此输出项2和4是 相同。
  • 地址* a = b处的值:因此输出项3和5是 相同。
+0

请记住,在程序启动阶段创建的所有变量都必须分配有不同的地址空间。因此a和b的地址必须不同。 –

相关问题