2015-02-16 3 views
0

мы имеемПутаница между массива и указатель переменной

int a[2] = { 0, 1 } ; 
std::cout << &a ; 
std::cout << a ; 

Теперь, когда я запускаю его, выход является одинаковым для обоих!

Из того, что я понял, a распадается на указатель и дает мне адрес первого элемента массива i.e адреса a[0].

Что похоже на печать std::cout << &a[0].

Теперь не должно std::cout << &a дать мне ошибку, так как a сам возвращает указатель?

+1

Нет - имя массива * обычно * распадается на указатель - но * не * при использовании в качестве операнда оператора 'sizeof' или оператора адреса (унарного' & '). –

+0

Стоит отметить, что 'a' и' & a' имеют разные типы, но оба конвертируются в 'void *'. – Brian

+1

Существует перегруженный 'operator <<', который принимает 'cout' и' void * '. Все указатели объектов могут быть преобразованы в 'void *', поэтому ошибок нет. –

ответ

3

Во-первых, в отношении

сам a возвращает указатель

Нет, распад массива указатель происходит только в условиях, когда ожидается указатель. Например, это не происходит в выражении sizeof или decltype или typeid или когда массив передается посредством ссылки на функцию или как здесь, когда применяется адресный оператор &.


&a и &a[0] (или просто a, когда распадался на указатель) ссылаются на тот же адрес памяти, а именно первый пункт a, но имеют разные типы.

&a - указатель на весь массив, и поэтому &a + 1 указывает на второй такой массив, следующий за первым.

&a[0] (или просто разложившийся a) является указателем на первый элемент, и поэтому &a[0] + 1 указывает на второй элемент.

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