2016-02-24 3 views
-2

Для int i[2][3], я получаю такое же значение при выполнении cout<<&i[0][0] и cout<<&i.Зачем стоит адрес переменной массива и адрес первого элемента?

Принимая во внимание, что i[0][0] является значением первого элемента, а &i[0][0] является адресом этого первого элемента. i является указателем и, следовательно, отличается от i[0][0], который является int. Он хранит адрес i[0][0]. Таким образом, i должен храниться в другом месте до i[0][0] вправо? Почему пришли оба адреса?

+0

Причина, по которой '& i [0] [0] == i' из-за распада матрицы на указатель. Причина, по которой '& i [0] [0] == & i' является совпадающей реализацией реализации. – user3528438

ответ

1

Массивы в C++ называются областями памяти (при условии, что указано имя массива). Таким образом, если рассмотреть ваш пример &i и &i[0][0], укажите тот же адрес младшего (первого) байта области, занимаемой элементами массива. Единственное отличие этих выражений (кроме их типов) - размеры заостренных объектов. Выражение

sizeof(*&i) 

дает размер всего массива тогда как экспрессия

sizeof(*&i[0][0]) 

дает размер в objedct типа Int.

В выражениях указатели массива преобразуются в указатели на их первые элементы.

+0

Я прошу проголосовать за этот ответ, если не будет доказано, что '& i == & i [0] [0]' является четко определенным поведением. – user3528438

+0

@ user3528438 Я не понял ваш комментарий. Вы можете написать это условие, например, отбрасывая оба указателя на void *. –

+0

Даже если вы отбрасываете оба на void *, я не думаю, что стандарт гарантирует их равную. Я предполагаю, что равенство реализуется. – user3528438

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