В чем разница между * & arr и * & arr [0] в C ++, если arr является массивом? - PullRequest
0 голосов
/ 30 марта 2020

Предположим, у меня есть массив целых чисел с именем arr. Я пытаюсь понять различие между *&arr и *&arr[0].

Я читал, что в C ++ arr - это, по сути, указатель на первый элемент в массиве, а &arr - это указатель на весь массив. Они оба возвращают один и тот же адрес, я получаю эту часть. Затем, если я введу *&arr[0], то возвращается первый элемент, то есть значение в arr[0]. Но если я введу *&arr, то адрес arr[0] вернется. У меня вопрос, почему, когда я использую *&arr, возвращается адрес, а не первый элемент? Logi c будет диктовать, что, поскольку оператор * возвращает значение, можно ожидать, что *&arr вернет первый элемент вместо адреса.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 30 марта 2020

Я читал, что в C ++ arr по сути является указателем на первый элемент в массиве

Это неправильно. Если arr - это массив, то это массив. Массивы не являются указателями 1 .

, почему при использовании * & arr возвращается адрес

Учитывая, что &arr[0] является указателем на первый элемент, обращающийся через указатель (*&arr[0]), дает ссылку lvalue на первый элемент.

Учитывая, что &arr является указателем на массив, косвенным путем через указатель (*&arr) дает вам lvalue ссылку на массив. Как и arr, этот массив lvalue распадается на указатель на первый элемент при преобразовании в rvalue.

За исключением случаев, когда операторы перегружены, *& по существу компенсируют друг друга. Это обратные операции. *&arr[0] дает вам то же, что и arr[0], а *&arr дает вам то же, что и arr.


1 За исключением объявления параметров функции, где массив parmeter фактически вообще не объявляет массив, а вместо этого указывает на элемент такого массива.

3 голосов
/ 30 марта 2020

Я читал, что в C ++ arr по сути является указателем на первый элемент в массиве

Тогда все, что вы читаете, неверно. Это правда, что массивы превратятся в указатель на их первый элемент, если вы посмотрите на них неправильно, но массивы не являются указателями .


Это не так:

  • *&arr возвращает весь массив. &arr формирует указатель на массив, а * разыменовывает этот указатель. Таким образом, тип этого выражения совпадает с arr. Еще раз, это превратится в указатель на первый элемент массива, если вы посмотрите на него неправильно. Например, если вы попытаетесь распечатать это с помощью std::cout << *&arr, массив распадется на указатель на свой первый элемент и, вероятно, в итоге вызовет перегрузку operator<<(std::ostream&, void*).

  • *&arr[0] дает первый элемент массива. arr[0] индексирует массив, & формирует указатель на первый элемент массива, затем * разыменовывает этот указатель. Тип этого выражения совпадает с arr[0].

2 голосов
/ 30 марта 2020

Одно является выражением int, другое - выражением int [N], для некоторого размера N.

Я читал, что в C ++ arr по сути является указателем

Выбрось эту книгу. Это опасно неточно. arr может конвертировать в указатель в любой момент, но он определенно не является указателем.

Они оба возвращают один и тот же адрес

Но не один и тот же type.

Мой вопрос: почему при использовании *&arr возвращается адрес, а не первый элемент?

Поскольку вы разыменовали указатель- к массиву. Если вы используете *&arr в контексте, который ожидает указатель, он уменьшается до единицы, как любое другое выражение массива.

...