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

What does *(&a)=5 mean?

本文关键字:是什么 意思      更新时间:2023-10-16

我正在研究指针。这很令人困惑——也许是因为我是新来的。我有一个问题,*(&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;
}

给定一个int a;,则&a会为您提供a的地址,即int *。给定一个int *p;,表达式*p给出了p所指向的int。因此*(&a)a地址后面的值,即a。换句话说,CCD_ 18的作用与仅仅CCD_。

有时这是有用的。给定一个std::vector<int>::iterator it;,您可以通过取消对迭代器的引用来获得指向迭代器所指向的int的指针,以获得int,然后获取地址,从而获得&(*it)

这在§5.3.1[expr.unary.op]:中有介绍

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

和:

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

3一元&运算符是指向其操作数的指针。

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

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

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

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

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