将字符指针分配给数组

5
 void fun(char arr[]){
 cout<<arr;//successfully received and printed

 }

main(){


   char *ptr="hello";
   fun(ptr);

   /*
   char arr2[]=ptr;  throws error....initialiser fails to determine size of arr2
   */

   getch();
   }`

为什么我可以传递char指针并在数组中接收它,但不能直接将char指针赋值给数组?据我所知,当我们将参数传递给函数时,赋值是隐式发生的。那么为什么会出现这种行为上的差异呢?

1个回答

8

声明

void fun(char arr[]){  

等价于

void fun(char *arr){  

这意味着,在这种情况下,不需要将字符数组的大小传递给函数。现在arr指向与ptr相同的位置。但是在...
char arr2[] = ptr;  

编译器不知道ptr的大小,因为它是指向字符串字面量hello的第一个字符的指针,因此编译器无法确定数组arr2的大小并抛出错误。您必须指定数组的大小。
只有在初始化程序中才可以省略字符数组的大小;
char arr2[] = "Hello World";   

在这种情况下,编译器从字符串 Hello World 的大小确定数组 arr2 的大小。

请原谅我如果我错了,但我认为数组名也是一个字符指针。所以即使我们在主函数内部执行它,它也应该能正常工作。 - Krrish Raj
3
数组和指针是两个不同的东西。数组名不是指针,但在某些情况下会退化为指向其第一个元素的指针。可以通过以下示例简单理解:数组名不能作为“=”运算符的左操作数,而指针可以。 - haccks
我明白了,谢谢。我的观察是,如果数组名作为函数参数接收数据,则始终会将其衰减为指针,因为我可以始终递增它,而数组名是不可修改的l值,不能递增,所以它必须是一个指针。如果我错了,请纠正我。 - Krrish Raj
抱歉,我不理解最后一句话:“因为我总是可以增加它”。你能再重新表达一下吗? - haccks
在上面的例子中,arr++是有效的,如果arr是一个数组就不可能这样做,因为我们不能递增数组名。所以我得出结论,fun中的arr[]已经衰变成了char指针。 - Krrish Raj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接