Array name 不是常量指针吗,不能用在指针运算中,为什么这个程序能运行呢?
Isn't Array name a constant pointer, which can't be used in pointer arithmetic, so why does this program work?
下面的 C 程序给我的输出为 b
,但是由于数组名称默默地“衰减”成一个常量指针,所以为什么下面的程序可以工作,它应该给出一个错误,说明需要 l 值,即.在 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);
}
编辑:
现在我做同样的事情但不是在不同的函数中,我在更新代码后得到错误。
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++;
^~
代码中
void f(char a[]){
a++;
printf("%c",*a);
}
a
不是一个数组——它是一个指针。在函数参数声明的上下文中,T a[N]
和 T a[]
被“调整”为 T *a
- 所有三个都将 a
声明为指向 T
的指针,而不是T
.
的数组
当您使用数组参数调用 f
时:
f(a);
表达式 a
从类型“int
的 10 元素数组”“退化”为“指向 int
的指针”,所以 f
实际接收到的是一个指针,而不是数组对象。完全等同于写
f( &a[0] );
代码中
void check(){
char a[10];
a[0] = 'a';
a[1] = 'b';
a[2] = 'c';
// f(a);
a++;
printf("%c",*a);
}
a
是数组表达式,不是指针,数组类型的表达式不能作为++
.[=28=的操作数]
下面的 C 程序给我的输出为 b
,但是由于数组名称默默地“衰减”成一个常量指针,所以为什么下面的程序可以工作,它应该给出一个错误,说明需要 l 值,即.在 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);
}
编辑:
现在我做同样的事情但不是在不同的函数中,我在更新代码后得到错误。
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++;
^~
代码中
void f(char a[]){
a++;
printf("%c",*a);
}
a
不是一个数组——它是一个指针。在函数参数声明的上下文中,T a[N]
和 T a[]
被“调整”为 T *a
- 所有三个都将 a
声明为指向 T
的指针,而不是T
.
当您使用数组参数调用 f
时:
f(a);
表达式 a
从类型“int
的 10 元素数组”“退化”为“指向 int
的指针”,所以 f
实际接收到的是一个指针,而不是数组对象。完全等同于写
f( &a[0] );
代码中
void check(){
char a[10];
a[0] = 'a';
a[1] = 'b';
a[2] = 'c';
// f(a);
a++;
printf("%c",*a);
}
a
是数组表达式,不是指针,数组类型的表达式不能作为++
.[=28=的操作数]