1

可能重复:
数组名称是 C 中的指针吗?

假设我有一个 char 数组,说 arr 和 arr 将代表第一个元素的地址,所以 arr++ 应该是完全合法的,那么为什么编译器会说“需要左值”。

另外,如果我这样做: arr=arr+1 那么为什么它是无效的转换。我只是将指针增加一。编译器告诉在 LHS 上操作数类型是 char[4] 但在 RHS 上它是 char *。

main()
{
char arr[]={'a','b','c','d'};
for(;arr!=arr+4;arr++) //lvalue required 
printf("%c",*arr);
}
4

3 回答 3

6

数组名不是可以赋值的变量。如果要修改它,则应使用指针变量:

char *arr_ptr = arr;

然后你可以做arr_ptr++and arr_ptr = arr_ptr+1;

于 2012-12-02T07:13:17.183 回答
2

数组名称或任何数组类型的表达式都会隐式转换为指向数组第一个元素的指针,除非它是:

  • 一元&(地址)表达式的操作数(产生整个数组的地址,而不是其第一个元素的地址——相同的内存地址,不同的类型);或者
  • 运算符的操作数sizeofsizeof 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 节,“数组和指针”。

于 2012-12-02T07:39:31.537 回答
2

数组不是指针。arr不代表地址。

于 2012-12-02T07:12:22.140 回答