数组名称或数组类型的任何表达式都被隐式转换为指向数组第一个元素的指针除非它是:
- 一元
& (address-of) 表达式的操作数(产生整个数组的地址,而不是其第一个元素的地址——相同的内存地址,不同的类型);或
-
sizeof 运算符的操作数(sizeof arr 产生数组的大小,而不是指针的大小);或
-
_Alignof 运算符的操作数(_Alignof arr 产生数组的对齐方式,而不是指针的对齐方式);或
- 用于初始化数组对象的初始化程序中的字符串文字。
_Alignof 是 C2011 的新成员。
(转换通常被称为“衰减”。)
这些都不适用,所以arr++尝试增加一个指针对象。问题是,没有指针object,只有一个指针value。 arr,在衰减为指针值后,不是左值,这意味着它不能出现在赋值的左侧,也不能作为++的操作数。
同样,给定:
int x;
表达式x是一个左值,所以你可以写x = 42;——但是表达式(x + 1)不是一个左值,所以你不能写(x + 1) = 42;。您可以分配给x,因为它引用了一个对象。 (x+1) 没有引用一个对象,所以没有什么可以分配的。 arr,在它衰减之后,也不引用对象(你有一个数组对象,但没有指针对象)。
(您对arr != arr + 4 的使用应该是一个线索;这永远不会是真的。)
而不是这样:
char arr[] = {'a', 'b', 'c', 'd'};
for (; arr != arr + 4; arr++) {
printf("%c", *arr);
}
你可以这样写:
char arr[] = {'a', 'b', 'c', 'd'};
char *ptr;
for (ptr = arr; ptr != arr + 4; ptr++) {
printf("%c", &ptr);
}
顺便说一下,在你的程序顶部,你应该改变这个:
main()
到这里:
#include <stdio.h>
int main(void)
另外,跑到comp.lang.c FAQ 并阅读第 6 节“数组和指针”。