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

问题描述 投票:0回答:4

我试图理解当 a 是指针时

a
&a
之间的区别。

在以下示例代码中:

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

根据我的理解,a是给a的地址赋予的name。那就是:

enter image description here

因此,当

a
是指针时,我期望
&a
a
相同。但在输出中,我得到的前两个值(
a
&a
)不同。

我哪里出错了?

c pointers pointer-to-pointer
4个回答
5
投票

首先,使用

%p
并将参数强制转换为
void *
以打印指针。为任何转换规范传递不兼容(不匹配)类型的参数都是未定义的行为

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

换句话说,

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

要添加一些参考,请引用

C11
,第 §6.5.3.2 章,

一元

&
运算符的操作数应为函数指示符、
[]
或一元
*
运算符,或 左值,指定不是位域且是的对象 未使用
register
存储类说明符声明。

并且,根据 §6.3.2.1,

左值是一个表达式(具有

void
以外的对象类型),可能 指定一个对象。 [...]


1
投票

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

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

返回例如:

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

0
投票

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


0
投票

实际上,“a”不仅仅是任何变量,而是一个指针变量,其中存储了整数类型变量“b”的地址。所以,当你打印'a'时,那么根据给定的数据,它将代表指针变量'a'=0x867f的内容,但&a用于表示指针变量'a'的位置或地址。所以,&a = 0x77e4。但是如果你在声明指针变量并存储另一个变量的地址(这里是“b”)之后写“a”,那么现在这个“”被称为解引用运算符,其功能是提供变量内容的内容'a',(即)给出存储在'a'中的位置'0x867f'的内容。现在,*a = 100,这是变量“b”的值。因此,a、&a 和 *a 的值都不相同。

© www.soinside.com 2019 - 2024. All rights reserved.