Почему мы не можем увеличить массив таким же образом, как указатель в c?
#include <stdio.h>
int main(){
int arr[] = {1, 2, 3, 4};
int *p;
p = arr;
printf("%d\n", *p);
printf("%d\n", *arr);
p++;
printf("%d\n", *p);
}
Этот код выводит:
1
1
2
но когда мы добавим 2 строки, как показано ниже:
#include <stdio.h>
int main(){
int arr[] = {1, 2, 3, 4};
int *p;
p = arr;
printf("%d\n", *p);
printf("%d\n", *arr);
p++;
printf("%d\n", *p);
arr++;
printf("%d\n", *arr);
}
Этот код выводит:
C:\Users\Hasnat\Desktop\test.c||In function 'main':|
C:\Users\Hasnat\Desktop\test.c|11|error: lvalue required as increment operand
=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===
Почему мы не можем увеличить массив таким же образом, как мы увеличиваем указатель, содержащий адрес этого массива, чтобы получить следующий элемент??
2 ответа
Цитировать C11
, глава 6.5.2.4, Постфиксные операторы увеличения и уменьшения
Операнд постфиксного оператора увеличения или уменьшения должен иметь атомарный, квалифицированный или неквалифицированный вещественный или указательный тип и быть модифицируемым lvalue.
и определение модифицируемого lvalue дано в главе 6.3.2.1 того же стандарта, Lvalues, массивы и обозначения функций
Lvalue - это выражение (с типом объекта, отличным от void), которое потенциально обозначает объект; [...] Модифицируемое lvalue - это lvalue, которое не имеет типа массива, не имеет неполного типа, не имеет типа с ограничениями, и, если это структура или объединение, не имеет какого-либо члена (в том числе рекурсивно любой член или элемент всех содержащихся агрегатов или объединений) с условно ограниченным типом.
Итак, вы не можете использовать ++
на массиве. Просто.
Потому что C не позволяет присваивать массиву. Массивы в выражениях автоматически преобразуются в указатель, указывающий на первый элемент массива, если только они не используются для операнда sizeof
операционный или одинарный &
(адрес) оператор. (N1256 6.3.2.1)
Как показывает сообщение об ошибке, операнд arr
преобразуется в указатель, указывающий на первый элемент массива, и указатель не является lvalue, поэтому его нельзя изменить с помощью оператора приращения.