【发布时间】:2017-12-11 07:20:26
【问题描述】:
据我所知,你不能修改数组变量
这段代码怎么运行没有任何错误。 有什么我在这里想念的吗? (这不是关于为什么会有 'L-VALUE REQUIRED' 错误,而是关于为什么没有。)
#include<stdio.h>
int strlens(char *s);
void main(){
char s[]="get me length of this string ";
// s++ ; this would give 'L-VALUE REQUIRED ERROR'
printf("%d",strlens(s));
}
int strlens(char s[]){
int i;
for(i=0; *s!='\0';++i, ++s) ; //++s: there is NO 'L-VALUE REQUIRED ERROR'
return i;
}
【问题讨论】:
-
s不是strlens中的数组名,它是一个指针。数组和指针是不同的类型。 -
当您执行
char s[]时,s是一个名称(编译时符号;没有运行时意义)。它没有分配任何空间,因此不存储地址。如果要进行指针运算,则需要将地址存储在某个地方,不是吗?在函数参数的情况下,您的原始字符数组的地址被压入堆栈,您的函数参数s指的是那个。因此,函数参数s为其分配了存储地址的空间。您现在可以进行指针运算,因为您可以对其进行运算。 -
@Yashas:“数组参数表现为指针”:它们不只是“表现为指针”,它们是指针。
-
错误信息具有误导性。
s是main中的左值。它不是一个可修改的左值。 -
明确说明这一点:
int strlens(char s[]);100% 等效 到int strlens(char * s);它是可互换的,编译器应该创建 exact两者都有一些代码。