我试图了解当a是指针时a
和&a
之间的差异。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
和&a
之间的差异。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
)不同。
我哪里错了?
首先,使用%p
并将参数转换为void *
来打印指针。为任何转换规范传递不兼容(不匹配)类型的参数是undefined behavior。
这就是说,即使是一个指针变量,也是一个变量,必须“存储”在一个地址中。所以,这是一个指针类型变量的地址。
换句话说,
b
是(类型int
的)变量中,并有一个地址。a
是一个变量(类型int *
),它也有也有有一个地址。要添加一些参考,引用C11
,章§6.5.3.2,
一元
&
操作者的操作数应是一个功能指示器,一个[]
或的结果一元运算符*
运算符或指定不是位字段的对象的左值,并且 未用register
存储类说明符声明。
和,从§6.3.2.1,
左值是潜在 指定的一个对象中的表达(与除
void
其他的对象类型)。 [...]
因此,在上图中,* a = 100,&a = 0x77e4和a = 0x867f。那是对的吗 ? –
@SeverusTux确切的说,是的。 –
其可能更容易地通过下面的简单的代码为例进行说明:
的printf( “%d%d%d%d%d”,& A,A,*一个,& b ,b);
返回例如:
290289632 290289644 100 290289644 100
请记住,在程序启动阶段创建的所有变量都必须分配有不同的地址空间。因此a和b的地址必须不同。 –
*根据我的理解,'a'是给a'地址的名字。*这是一个误解。 'a'是代表特定地址的值的名称。所以使用'a'你可以访问这个值。使用'&a'可以访问由'a'表示的值的地址。然后'* a'假设'a'表示的值本身就是一个地址,'* a'表示该地址的值。 – lurker