int arr[5];
arr++;
arr+4; //compile with only this
printf("%u", arr);
为什么C语言编译器无法使用arr++
编译" lvalue required"但可以
使用arr+4
成功编译? arr++
符号的左值概念是什么?
答案 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);