C &引用;“所需左值”;尝试递增数组时出错

C &引用;“所需左值”;尝试递增数组时出错,c,arrays,lvalue,C,Arrays,Lvalue,可能重复: 假设我有一个字符数组,表示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",*ar

可能重复:


假设我有一个字符数组,表示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);
}

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

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

数组名称不是可分配给的变量。如果要修改它,应使用指针变量:

char *arr_ptr = arr;

然后可以执行
arr_ptr++
arr_ptr=arr_ptr+1

数组名称不是可分配给的变量。如果要修改它,应使用指针变量:

char *arr_ptr = arr;

然后可以执行
arr_ptr++
arr_ptr=arr_ptr+1

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

  • 一元
    &
    (address of)表达式的操作数(它产生整个数组的地址,而不是它的第一个元素的地址——相同的内存地址,不同的类型);或
  • sizeof
    运算符的操作数(
    sizeof arr
    产生数组的大小,而不是指针的大小);或
  • \u Alignof
    运算符的操作数(
    \u Alignof arr
    产生数组的对齐,而不是指针的对齐);或
  • 初始值设定项中的字符串文字,用于初始化数组对象
\u 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)
#包括
内部主(空)

此外,请运行、不要行走,转到并阅读第6节“数组和指针”。

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

  • 一元
    &
    (address of)表达式的操作数(它产生整个数组的地址,而不是它的第一个元素的地址——相同的内存地址,不同的类型);或
  • sizeof
    运算符的操作数(
    sizeof arr
    产生数组的大小,而不是指针的大小);或
  • \u Alignof
    运算符的操作数(
    \u Alignof arr
    产生数组的对齐,而不是指针的对齐);或
  • 初始值设定项中的字符串文字,用于初始化数组对象
\u 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)
#包括
内部主(空)

另外,运行,不要走,到第6节“数组和指针”阅读。

将您迄今为止尝试过的代码发布到“arr将代表第一个元素的地址”不,它将代表一个数组。该数组可能会隐式转换为指针,该指针的值与
&arr[0]
相同,但这并不意味着它是指针。将您迄今为止尝试过的代码发布到“arr将表示第一个元素的地址”否,它将表示数组。该数组可以隐式转换为指针,该指针的值将与
&arr[0]
相同,但这并不意味着它是指针。
arr
表示第一个元素的地址。@GrijeshChauhan不,它不是(这几乎是一致的).我的意思是
arr
包含第一个元素的地址..尽管我没有被否决
arr
不包含地址。
arr
表示第一个元素的地址。@GrijeshChauhan不,它不包含地址(这几乎不连贯)。我的意思是什么