用符号arr + 4和arr ++

时间:2017-08-09 16:12:08

标签: c

   int arr[5];

   arr++;                                                        
   arr+4;                  //compile with only this 
   printf("%u", arr);

为什么C语言编译器无法使用arr++编译" lvalue required"但可以 使用arr+4成功编译? arr++符号的左值概念是什么?

1 个答案:

答案 0 :(得分:3)

使用arr时,它可以自然地衰减指向其第一个元素的指针,即它等同于&arr[0]

执行arr++时,您尝试修改此指针(有效地执行arr = arr + 1)。这是不可能的,因为阵列的位置是固定的,不能修改。

使用arr + 4您正在执行指针算术。在这里,您将4添加到衰减指针,但不要尝试修改指针本身。实际上这等于&arr[4]

您显示的代码中还有一个小问题。我说小但我的意思是

printf("%u", arr);

你让数组衰减成指针。然后尝试使用"%u"格式说明符打印此指针。 格式说明符是打印int,而不是指针。不匹配的格式说明符和参数类型会导致未定义的行为

要使用通用(void *)指针,您需要使用"%p"格式,并将指针强制转换为void *

printf("%p", (void *) arr);