2

在下面的代码中 -

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

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

cout << &(arr);

cout << &(arr+1);

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

但是如果我们保留第二个 cout 它会产生编译错误。

为什么它会以这种方式运行?

4

2 回答 2

1

为什么它会以这种方式运行?

将整数添加到指针†</sup> 是产生新值的表达式。表达式的值类别是右值。

地址运算符的操作数必须是左值。右值不是左值。您不能获取返回新值的表达式的地址。


有点不清楚您要做什么。以下是一些表达式示例:

&(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

†</sup>arr不是指针;它是一个数组。但是数组衰减为指向使用该值的表达式中的第一个元素的指针,因此在这种情况下,表达式的类型确实是数组指针转换后的指针。

于 2019-02-24T22:16:23.770 回答
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

这里有一个在线演示。顺便说一句,第一个可以简化为cout<<arr<<endl;

于 2019-02-24T22:13:22.950 回答