2014-04-25 3 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 [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]', вот в чем разница, о которой я говорил. Уточненный немного. –

Смежные вопросы