在下面的代码中 -
(考虑到此代码包含在带有所有必要标题的 main 函数中)
int arr[5] = {10,20,30,40,50};
cout << &(arr);
cout << &(arr+1);
如果我们只保留第一个 cout 它可以工作并打印数组的起始地址。
但是如果我们保留第二个 cout 它会产生编译错误。
为什么它会以这种方式运行?
在下面的代码中 -
(考虑到此代码包含在带有所有必要标题的 main 函数中)
int arr[5] = {10,20,30,40,50};
cout << &(arr);
cout << &(arr+1);
如果我们只保留第一个 cout 它可以工作并打印数组的起始地址。
但是如果我们保留第二个 cout 它会产生编译错误。
为什么它会以这种方式运行?
为什么它会以这种方式运行?
将整数添加到指针†</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
不是指针;它是一个数组。但是数组衰减为指向使用该值的表达式中的第一个元素的指针,因此在这种情况下,表达式的类型确实是数组指针转换后的指针。
因为&
正在获取左值的地址,即对象。
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;