&(массив +1) выдает ошибку компиляции, пока работает &arr
В приведенном ниже коде
(Учтите, что эти коды заключены в основную функцию со всеми необходимыми заголовками)
int arr[5] = {10,20,30,40,50};
cout << &(arr);
cout << &(arr+1);
Если мы просто сохраним первый cout, он заработает и напечатает начальный адрес массива.
Но если мы сохраним второй cout, это даст ошибку компиляции.
Почему так себя ведет?
2 ответа
Так как &
принимает адрес 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;
Почему так себя ведет?
Добавление целого числа к указателю† - это выражение, которое приводит к новому значению. Категория значения выражения - rvalue.
Операнд оператора адреса должен быть 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
не указатель; это массив. Но массивы затухают до указателя на первый элемент в выражениях, которые используют значение, поэтому в этом контексте тип выражения действительно является указателем после преобразования указателя массива.