有人可以解释错误吗?

时间:2013-08-22 05:25:49

标签: c arrays compiler-errors

我有一个C程序,在函数func中有两个for循环。在第一个for循环中,在递增数组变量a时,没有'左值需要'错误,但在第二个c循环中递增数组变量for时,编译器给出'左值'错误。为什么呢?

#include<stdio.h>
#include<string.h>
void func(char a[],int n);

int main(int argc,char **argv){

    char * s="Happy ,People\n\n";
    func(s,strlen(s));

    return 0;
}

void func(char a[],int n){
    for(int i=0;i<n;i++){
        printf("%c",*a++);      //This works fine — no lvalue error here
    }

    char c[]="Happy ,People\n\n";
    for(int i=0;i<n;i++){
        printf("%c",*c++); // there is error coming here lvalue Required
    }
}

2 个答案:

答案 0 :(得分:4)

在函数中,c是一个数组。数组的名称是常量。你不能递增或递减它。

与流行的神话相反,数组和指针之间存在差异。

在函数原型中使用[]会使事情混淆,因为它们确实可以识别指针。你得到的结果与:

相同
void func(char *a, int n)
{
    for (int i = 0; i < n; i++)
        printf("%c",*a++);
    char c[] = "Happy, People\n\n";
    for (int i = 0; i < n; i++)
        printf("%c",*c++);
}

答案 1 :(得分:2)

数组不是左值。数组的名称是指向数组第一个元素的指针常量。您无法修改阵列名称所指向的地址。在以下代码片段中:

char c[]="Happy ,People\n\n";
for(int i=0;i<n;i++){
printf("%c",*c++); // there is error coming here lvalue Required

当您尝试*c++时,您正在尝试修改c指向的内容。由于c是指针常量而不是变量,因此会出现编译错误。

但是,当您将数组传递给函数时,数组“衰减”到指针,并且指向数组的指针按值传递。该函数接收一个与原始指针具有相同值的新指针 - 即指向同一位置的新指针,该指针是数组的第一个元素。由于它不是常量,因此可以将新指针修改为指向其他位置。因此*a++不会导致编译器错误。