2014-04-25 40 views
0
#include <iostream> 
using namespace std; 
int main() 
{ 
    int foo[5] = {0,1,2,3,4}; 
    cout << (&foo[0]) << " " << foo <<endl; 

    return 0; 
} 

输出结果为0x28feec 0x28feec。 foo [0],foo和& foo之间的区别是什么?& foo? 如果foo是指向foo [0]地址的指针,是否可以使用它?阵列名称的C++值

谢谢您的回答。

+1

这也是对[性病::流::运算<<](http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt) –

回答

3

foo(不访问数组元素)将在发送到输出流时衰减到第一个数组元素的地址(foo[0])。

foo[0]将返回第一个数组元素,&foo[0]将衰减到它的地址。因此两个输出值是相同的。

2

的区别是类型:

  • foo具有类型int(&)[5]
  • foo[0]具有类型int&
  • &foo具有类型int (*)[5]
  • &foo[0]具有类型int*

operator<<不接受对数组的引用,因此在cout << foo中它会衰减到指针,与&foo[0]一样。而&foo是指向相同地址的指针。但是,如果您使用sizeof或进行指针算术,则会有很大的差异,因为这样会导致重要的问题。

例如:

(&foo[0]) + 1 == &foo[1] 

(&foo)[1] == &foo[5] 
+0

@delnan:'foo + 1!=(&foo)[1]',这就是我在谈论的区别。澄清一点。 –