Я слышал, что массив эквивалентен константному указателю и не может быть увеличен, поскольку он не является lvalue ...
Почти.
Массив выражение является немодифицируемым lvalue ;он не может быть операндом для таких операторов, как ++
или --
, и он не может быть целью выражения присваивания.Это не то же самое, что постоянный указатель (то есть указатель, объявленный как T * const
).
Выражение массива будет заменено выражением-указателем, значением которого является адрес первого элемента массива , за исключением , когда выражение массива является операндом sizeof
или унарным &
операторов, или когда выражение массива является строковым литералом, используемым для инициализации другого массива в объявлении.
Когда вы вызываете функцию с аргументом массива, таким как
int a[N];
...
foo(a);
, выражение a
преобразуется из типа "N-элемент массива * 1028указатель * to на int
и значение этого указателя передается в foo
;таким образом, соответствующий прототип функции должен быть
void foo (int *arr) {...}
Обратите внимание, что в контексте объявления параметров функции T a[]
и T a[N]
идентичны T *a
;во всех трех случаях a
объявляется как указатель на T
.В функции foo
параметр arr
является выражением-указателем, которое является изменяемым значением l, и поэтому оно может быть назначено и может быть операндом ++
и * 1044.* операторы.
Помните, что все эти преобразования находятся в массиве expression ;то есть идентификатор массива или другое выражение, которое ссылается на массив объект в памяти.Объект массива (кусок памяти, содержащий значения массива) не конвертируется.