&(array + 1)在&arr工作时给出编译错误

时间:2019-02-24 22:08:54

标签: c++ arrays pointers address-operator

在下面的代码中-

(考虑到此代码包含在main函数中并带有所有必需的标头)

int arr[5] = {10,20,30,40,50};

cout << &(arr);

cout << &(arr+1);

如果我们只保留第一个cout,它将起作用并打印数组的起始地址。

但是,如果我们保留第二个cout,则会出现编译错误。

为什么它会以这种方式表现?

2 个答案:

答案 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不是指针;它是一个数组。但是数组会衰减为使用该值的表达式中指向第一个元素的指针,因此在这种情况下,表达式的类型确实是数组指针转换之后的指针。