a,& a和* a有什么区别?

时间:2017-08-10 09:41:21

标签: c pointers pointer-to-pointer

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

在以下示例代码中:

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

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

enter image description here

因此,当a是指针时,我希望&aa相同。但是在输出中,我将前两个值(a&a)视为不同。

我哪里错了?

3 个答案:

答案 0 :(得分:5)

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

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

换句话说,

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

添加一些引用,引用C11,章节§6.5.3.2,

  

一元&运算符的操作数应该是函数指示符,是a的结果   []或一元*运算符,或指定不是位字段的对象的左值   未使用register存储类说明符声明。

,§6.3.2.1,

  

左值是一种潜在的表达式(对象类型不是void)   指定一个对象。 [...]

答案 1 :(得分:1)

通过以下简单的代码示例可能更容易解释:

  

printf("%d%d%d%d%d",& a,a,* a,& b,b);

返回例如:

net use Q: \\ma-dev-cd1\c$\ >> C:\resful.txt 2>&1
xcopy c:\resful.txt z:\Build
  • a的地址:& a是启动时分配的东西(输出项目 1)。
  • 指向b的地址,因此输出项目2和4是 相同。
  • 地址的值* a = b:因此输出项目3和5是 同样。

答案 2 :(得分:0)

这里基本上* a存储b的值,即100,&a是指针a本身的地址,因为它也是变量,因此必须具有地址,并且a指向变量所指向的地址(在这种情况下为b的地址)