数组名作为函数参数时,函数内部重新赋值,调用结束是否改变函数值。下面fun1和fun2区别?

2025-03-20 06:41:11
推荐回答(2个)
回答1:

void fun1(char str[])
{
char *p="hello world!";
strcpy(str,p);
printf("fun1: %s\n",str);
}

这个会改变原字符数组的值,这里数组名作为参数,其实传递的是数组首元素的地址,形参是指向实参地址的一个变量。
即 fun1(str); 函数调用后, 形参函数内的str所指向的内存地址 和 外面实参str地址是同一个。
strcpy(str,p); 是字符串拷贝函数,赋值后,其实相当于对str所指向内存内容的处理,将p指向的地址的内容赋值给了 str地址的内存中。 又因为 函数内参数str 和外的str是指向的同一个地址,因此会改变原始数组的值。

void fun2(char str[])
{
char *p="hello world!";
str=p;
printf("fun2: %s\n",str);
}
该函数调用后不会改变原来的值。
相当于是调用的时候 函数内 str 地址 和 外面的str地址是指向同一个内存单元。
不同的是 str=p; 这个地方相当于将函数内的 str指针的指向 了p指针的指向的地址。只是地址指向变了,并没有对原始地址的内容作操作,因此不会改变。

另外,函数写的有些问题, main函数里面 字符数组太小额,如果调用函数1 就会出现字符串溢出的情况(helloworld 字符太多了),会出现错误的。还是把数组改大点好。

回答2:

别在这问编程了 码农都睡了 估计