[英]What does *(&a)=5 mean?
我正在研究指针。 这很令人困惑-也许是因为我是新来的。 我有一个问题,在下面的简短程序中*(&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
。 换句话说*(&a)
不一样的只是a
。
有时候这很有用。 给定一个std::vector<int>::iterator it;
您可以通过取消引用迭代器以获取int
然后获取地址来获取指向迭代器指向的int
的指针,从而获得&(*it)
。
&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
的值
第5.3.1节[expr.unary.op]中对此进行了介绍:
1一元*运算符执行间接操作:应用该表达式的表达式应为指向对象类型的指针或为函数类型的指针,并且结果为指向表达式所指向的对象或函数的左值。 如果表达式的类型为“ T的指针”,则结果的类型为“ T”。
和:
2以下每个一元运算符的结果是一个prvalue。
3一元&运算符的结果是指向其操作数的指针。
由于&a
产生prvalue
,因此&a = 5
无效,因为&a
不是左值。 内置赋值运算符的左侧只能显示可修改的左值。
另一方面, *(&a)
产生一个左值(使其可赋值)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.