我正在研究指针。这很混乱 - 也许是因为我是新人。我有一个问题,*(&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;
}
答案 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)
产生左值(使其可分配)。