数组名称或任何数组类型的表达式都会隐式转换为指向数组第一个元素的指针,除非它是:
- 一元
&
(地址)表达式的操作数(产生整个数组的地址,而不是其第一个元素的地址——相同的内存地址,不同的类型);或者
- 运算符的操作数
sizeof
(sizeof arr
产生数组的大小,而不是指针的大小);或者
- 运算符的操作数
_Alignof
(_Alignof arr
产生数组的对齐方式,而不是指针的对齐方式);或者
- 用于初始化数组对象的初始化程序中的字符串文字。
_Alignof
是 C2011 中的新内容。
(转换通常被称为“衰减”。)
这些都不适用于这里,因此arr++
尝试增加指针对象。问题是,没有指针对象,只有一个指针值。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 节,“数组和指针”。