我在这里获得输出' bcde'但是因为' a'是一个常量数组指针,它不应该在fun()
内增加吗?那么为什么允许这里呢?
void fun(char a[])
{
a++;
printf("%s",a);
}
void main()
{
char a[]="abcde";
fun(a);
}
答案 0 :(得分:3)
当您将数组传递给C中的函数时,数组会“衰减”为指针。换句话说,可以像这样声明等效函数:
void fun(char *a)
现在函数内部的代码非常有意义:指针递增,所以当结果传递给printf
时,从第二个字母开始打印原始字符串。
答案 1 :(得分:2)
当您将数组名称传递给函数时,您将指针传递给它的第一个元素。
void fun(char a[]) // a is not an array of char
相当于
void fun(char *a)
您可以在函数内部修改a
,因为它不是数组名称,而是指向char
的指针。
您无法修改a
中的main
,因为它被声明为数组。数组名称是不可修改的l值。
答案 2 :(得分:1)
当您处于函数参数中时,char a[]
的处理方式与编写char *a
完全相同。
答案 3 :(得分:1)
没有任何“常量数组指针”
在本声明中
char a[]="abcde";
声明了一个非const数组。您可以将其更改为例如
a[0] = 'A';
当您将数组作为参数传递给函数时,会使用从数组到类型char *
的指针的转换,该指针指向数组的第一个元素。
此功能声明
void fun(char a[]);
相当于
void fun(char *a);
该参数与指针相邻。
因此,在函数内部,您可以更改指针本身及其指向的对象。例如
a++;
*a = 'B';
如果您希望在函数中不更改指针,可以将其声明为
void fun(char * const a);
在这种情况下,编译器会为语句
发出错误 a++;
因为a确实是一个const指针。