why can not we increment an array in similiar way as pointer in c? [duplicate]

佐手、 提交于 2020-01-03 07:02:05

问题


#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);
}

This code outputs:

1
1
2

but when we add 2 lines as below:

 #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);
    }

This code outputs:

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)) ===

Why can not we increment an array in same way we increment pointer containing address of that array to get next element??


回答1:


To quote C11, chapter 6.5.2.4, Postfix increment and decrement operators

The operand of the postfix increment or decrement operator shall have atomic, qualified, or unqualified real or pointer type, and shall be a modifiable lvalue.

and the definition of modifiable lvalue is given in chapter 6.3.2.1 of the same standard, Lvalues, arrays, and function designators

An lvalue is an expression (with an object type other than void) that potentially designates an object; [...] A modifiable lvalue is an lvalue that does not have array type, does not have an incomplete type, does not have a constqualified type, and if it is a structure or union, does not have any member (including, recursively, any member or element of all contained aggregates or unions) with a constqualified type.

So, you cannot use ++ on an array. Simple.




回答2:


Because C doesn't allow assigning to array. Arrays in expressions are automatically converted to a pointer pointing at the first element of the array unless they are used for the operand of sizeof operating or unary & (address) operator. (N1256 6.3.2.1)

As the error message shows, the operand arr is converted to a pointer pointing the first element of the array and the pointer isn't a lvalue, so it cannot be modified via increment operator.



来源:https://stackoverflow.com/questions/34356291/why-can-not-we-increment-an-array-in-similiar-way-as-pointer-in-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!