2013-08-22 84 views
1

我有一个C程序下面和功能func有两个for循环。在第一个for循环中,在增加数组变量a时,没有“需要左值”错误,但在第二个for循环中增加了数组变量c时,编译器给出了“需要左值”错误。为什么?有人可以解释错误吗?

#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 
    } 
} 
+0

还有一个来自我的建议 - 仅仅为变量使用有意义的名称而不是'a []'和'c []'。它的一个会议无论如何:) – 0decimal0

回答

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++); 
} 
+0

+1我希望我能再次投票,这只是为了提到神话。我继续看到它(神话)延续,我唯一的回应是“指针*保持*地址;数组* *地址。”谢谢你提到差异。 – WhozCraig

+0

+1 for *并且在函数原型中使用[]会混淆事物,因为它们确实识别指针* :) – 0decimal0

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++不会导致编译器错误。