我试图理解当 a 是指针时
a
和 &a
之间的区别。
在以下示例代码中:
int main()
{
int b = 100;
int *a;
a = &b;
printf("%d %d %d", a , &a , *a);
return 0;
}
根据我的理解,a是给a的地址赋予的name。那就是:
因此,当
a
是指针时,我期望 &a
和 a
相同。但在输出中,我得到的前两个值( a
和 &a
)不同。
我哪里出错了?
首先,使用
%p
并将参数强制转换为 void *
以打印指针。为任何转换规范传递不兼容(不匹配)类型的参数都是未定义的行为。
也就是说,即使是指针变量,也是变量,并且必须“存储”在地址中。所以,它是一个指针类型变量的地址。
换句话说,
b
是一个变量(类型为 int
)并且它有一个地址。a
是一个变量(类型为 int *
)并且它 also 有一个地址。要添加一些参考,请引用
C11
,第 §6.5.3.2 章,
一元
运算符的操作数应为函数指示符、&
或一元[]
运算符,或 左值,指定不是位域且是的对象 未使用*
存储类说明符声明。register
并且,根据 §6.3.2.1,
左值是一个表达式(具有
以外的对象类型),可能 指定一个对象。 [...]void
通过以下简单的代码示例可能更容易解释:
printf("%d %d %d %d %d", &a , a , *a, &b, b);
返回例如:
290289632 290289644 100 290289644 100
这里基本上 *a 存储的是 b 的值,即 100,&a 是指针 a 本身的地址,因为它也是一个变量,因此必须有一个地址,a 指的是变量所指向的地址(b 的在这种情况下的地址)
实际上,“a”不仅仅是任何变量,而是一个指针变量,其中存储了整数类型变量“b”的地址。所以,当你打印'a'时,那么根据给定的数据,它将代表指针变量'a'=0x867f的内容,但&a用于表示指针变量'a'的位置或地址。所以,&a = 0x77e4。但是如果你在声明指针变量并存储另一个变量的地址(这里是“b”)之后写“a”,那么现在这个“”被称为解引用运算符,其功能是提供变量内容的内容'a',(即)给出存储在'a'中的位置'0x867f'的内容。现在,*a = 100,这是变量“b”的值。因此,a、&a 和 *a 的值都不相同。