1

我在下面有一个 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
    }
}
4

2 回答 2

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++);
}
于 2013-08-22T05:28:47.880 回答
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++不会导致编译器错误。

于 2013-08-22T05:38:39.430 回答