Почему мы не можем увеличить массив таким же образом, как указатель в 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, поэтому его нельзя изменить с помощью оператора приращения.

Другие вопросы по тегам