在下面的代码中-
(考虑到此代码包含在main函数中并带有所有必需的标头)
int arr[5] = {10,20,30,40,50};
cout << &(arr);
cout << &(arr+1);
如果我们只保留第一个cout,它将起作用并打印数组的起始地址。
但是,如果我们保留第二个cout,则会出现编译错误。
为什么它会以这种方式表现?
答案 0 :(得分:1)
因为&
使用的是左值(即对象)的地址。
arr
是与数组相对应的左值。这就是为什么第一个可行的原因。但是arr+1
不是。这是一个临时结果(顺便说一句,该结果已经对应一个地址)。
如果要获取地址,而不会出现编译错误,则可以使用以下之一:
cout << arr+1 <<endl; // get address directly using pointer maths
cout << &arr[1] <<endl; // gets address of an element in the array
cout << &*(arr+1) <<endl; // long and painful: transform an address in a pointr
// and back again. Better use the first alternative
这里是online demo。顺便说一句,第一个可以简化为cout<<arr<<endl;
答案 1 :(得分:1)
为什么它会以这种方式表现?
将整数添加到指针†是一个产生新值的表达式。表达式的值类别为rvalue。
地址运算符的操作数必须为左值。右值不是左值。您不能使用返回新值的表达式的地址。
目前尚不清楚您要做什么。以下是一些表达式示例:
&(arr[0]) // address of the first element
arr + 0 // same as above
&(arr[1]) // address of the second element
arr + 1 // same as above
&arr // address of the array.
// note that type of the expression is different,
// although the value is same as the first element
(&arr) + 1 // address of the next array (only valid if arr is
// a subarray within a multidimensional array
// which is not the case in your example)
&(arr+1) // ill-formed; has no sensical interpretation
† arr
不是指针;它是一个数组。但是数组会衰减为使用该值的表达式中指向第一个元素的指针,因此在这种情况下,表达式的类型确实是数组指针转换之后的指针。