& (массив + 1) выдает ошибку компиляции, пока работает & arr - PullRequest
0 голосов
/ 25 февраля 2019

В приведенном ниже коде -

(Учтите, что эти коды включены в основную функцию со всеми необходимыми заголовками)

int arr[5] = {10,20,30,40,50};

cout << &(arr);

cout << &(arr+1);

Если мы просто сохранимПервый cout работает и печатает начальный адрес массива.

Но если оставить второй cout, он выдаст ошибку компиляции.

Почему он так себя ведет?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Почему он ведет себя таким образом?

Добавление целого числа к указателю - это выражение, которое приводит к новому значению.Категория значения выражения - rvalue.

Операндом оператора address-of должен быть lvalue.Значения не являются значениями.Вы не можете взять адрес выражения, которое возвращает новое значение.


Несколько неясно, что вы пытаетесь сделать.Вот несколько примеров выражений:

&(arr[0])   // address of the first element
arr + 0     // same as above

&(arr[1])   // address of the second element
arr + 1     // same as above

&arr        // address of the array.
            // note that type of the expression is different,
            // although the value is same as the first element

(&arr) + 1  // address of the next array (only valid if arr is
            // a subarray within a multidimensional array
            // which is not the case in your example)

&(arr+1)    // ill-formed; has no sensical interpretation

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

0 голосов
/ 25 февраля 2019

Поскольку & принимает адрес lvalue , то есть объекта.

arr - это lvalue, соответствующее массиву.Вот почему первый работает.Но arr+1 нет.Это временный результат (который, кстати, уже соответствует адресу).

Если вы хотите получить адрес без ошибки компиляции, вы можете использовать один из следующих способов:

cout << arr+1 <<endl;      // get address directly using pointer maths
cout << &arr[1] <<endl;    // gets address of an element in the array
cout << &*(arr+1) <<endl;  // long and painful:  transform an address in a pointr
                           // and back again.  Better use the first alternative

Здесь онлайн-демонстрация .Кстати, первое можно упростить до cout<<arr<<endl;

...