*(& a)= 5是什么意思?

时间:2014-10-12 21:08:55

标签: c++ c++11

我正在研究指针。这很混乱 - 也许是因为我是新人。我有一个问题,*(&a)在以下简短程序中表明了什么。

在第7行,我知道*(&a)表示“变量a地址的值”,但在第13行,*(&a)=5是什么意思?当我分配&a=5时,编译器会给出“作为左操作数分配所需的左值”的错误,但是当我在*(&a)中分配值时,它会编译而没有错误。

#include <stdio.h>

int main()
{
  int *p, a = 2, b;

  b = *(&a);         // line 7
  printf("%d", b);

  p = &a;
  printf("%d", p);

  *(&a) = 5;         // line 13
  printf("%d", a);

  return 0;
}

3 个答案:

答案 0 :(得分:1)

鉴于int a;&a会为您提供a的地址int *。给定int *p;表达式*p为您提供int指向的p。因此*(&a)a地址背后的值a。换句话说,*(&a)a的作用相同。

有时这很有用。给定std::vector<int>::iterator it;,您可以通过解引用迭代器获取int来获取指向迭代器所指向的int的指针,然后获取地址,这样就得到&(*it)

答案 1 :(得分:0)

&a将返回指向a或a所在的内存地址的指针。解除引用运算符*返回地址指向的数据的值。请考虑以下代码。

int foo = 3;
int* bar = &foo; /// bar points to foo.
printf( "%d\n", *bar ); /// will print 3
printf( "%d\n", *(&foo) ); /// will also print 3

变量bar指向foo所在的内存地址。通过使用解除引用运算符,您可以获得存储在bar中包含的地址的内存中的值。最后一个例子将两者合并,你得到一个指向foo的指针并立即取消引用它,它返回foo中存储的值

答案 2 :(得分:0)

这在第5.3.1节[expr.unary.op]中有所介绍:

  

1一元*运算符执行间接:表达式   应用它应该是指向对象类型的指针,或指向a的指针   函数类型,结果是引用对象或的左值   表达式指向的函数。如果是表达式的类型   是“指向T的指针”,结果的类型是“T”。

  

2以下每个一元运算符的结果都是prvalue。

     

3一元&amp;的结果operator是指向其操作数的指针。

由于&a产生prvalue&a = 5无效,因为&a不是左值。只有可修改的左值可以出现在内置赋值运算符的左侧。

另一方面,*(&a)产生左值(使其可分配)。