The following C program gives me output as b but since Array name silently "decays" into a constant pointer so why does the following program work, It should have given an error saying l value required, ie. a variable pointer required for assignment on LHS?
void check(){
char a[10];
a[0] = 'a';
a[1] = 'b';
a[2] = 'c';
f(a);
}
void f(char a[]){
a ;
printf("%c",*a);
}
Edit :
Now I do the same thing but not in a different function, and I get the error following the updated code.
void check(){
char a[10];
a[0] = 'a';
a[1] = 'b';
a[2] = 'c';
// f(a);
a ;
printf("%c",*a);
}
source_file.c: In function ‘check’:
source_file.c:73:4: error: lvalue required as increment operand
a ;
^~
CodePudding user response:
In the code
void f(char a[]){
a ;
printf("%c",*a);
}
a is not an array - it's a pointer. In the context of a function parameter declaration, T a[N] and T a[] are "adjusted" to T *a - all three declare a as a pointer to T, not an array of T.
When you called f with an array argument:
f(a);
the expression a "decayed" from type "10-element array of int" to "pointer to int", so what f actually receives is a pointer, not an array object. It's exactly equivalent to writing
f( &a[0] );
In the code
void check(){
char a[10];
a[0] = 'a';
a[1] = 'b';
a[2] = 'c';
// f(a);
a ;
printf("%c",*a);
}
a is an array expression, not a pointer, and an expression of array type cannot be the operand of .
