请考虑以下代码。为了清晰起见,我已经包含了过多的couts(至少在我的结尾):
#include <iostream>
using namespace std;
int main(){
double *array1;
array1 = new double[10];
array1[5] = 10;
//the following 2 lines return the same thing
cout << "array1 = " << array1 << endl;
cout << "&array1[0] = " << &array1[0] << endl;
double *subarray1;
subarray1 = new double[5];
subarray1 = &array1[5];
//now the following 2 lines return the same thing
cout << array1[5] << endl;
cout << subarray1[0] << endl;
//but I'm not allowed to do:
//&subarray1[0] = &array1[5];
return 0;
}
因为
subarray1 == &subarray1[0]
因为我被允许这样做:
subarray1 = &array1[5];
那为什么我不能这样做:
&subarray1[0] = &array1[5];
我收到的错误是:警告:作业目标不是真正的左值;这将是一个很难的错误
答案 0 :(得分:2)
表达式subarray1
是指向同名指针对象的左值。该指针指向动态分配缓冲区的第一个元素。
表达式&subarray1[0]
是一个 rvalue 指针,指向动态分配的缓冲区的第一个元素(因此它的计算结果与subarray1
的值相同)。
这些不是相同的东西,你可能不会分配给 rvalue 。