当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
)视为不同。
我哪里错了?
答案 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
答案 2 :(得分:0)
这里基本上* a存储b的值,即100,&a是指针a本身的地址,因为它也是变量,因此必须具有地址,并且a指向变量所指向的地址(在这种情况下为b的地址)