我有一个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
}
}
答案 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++
不会导致编译器错误。