您的位置:首页 > 其它

数组名作为函数传递时的一些有趣现象

2018-02-09 17:34 225 查看
最近在学习数组的过程中,遇到了一系列的数组名作为函数参数的问题,并发现了很多有趣的现象。
1.char test(char string)
{
string[2] = 'r';
return 0;
}
这个函数首先是不能通过编译的,让我们看看错误提示:
(请先忽略掉return)



很明显,是我们的 函数的  形式参数  的类型与函数体中表达式所要“使用“的类型不同。我们往往心里知道,在调用函数时传递给函数的是一个数组,但实际上,我们定义的(char string)并不是数组,而仅仅是一个“char”型变量。
我们可能想在main中这样做:int main()
{
char a[] = {'a','b','c'};
printf("%c\n", test(a));
return 0;
}
char test(char string)
{
string[2] = 'r';
return 0;
}
此时的错误信息是这样的:



很明显,实参(char a[]=...)是一个字符数组,也可以叫做“char *”型数组;而形参(char string)则是一个字符型“char”型变量。
所以,尽管我们心里知道string 是一个数组,并在调用时也确实将数组型的实参传递给它,但计算机并不这么认为。
计算机需要更为精确的说明。
2.
char test(char string[]);
int main()
{
char a[] = {'a','b','c'};
printf("%c\n", test(a));
return 0;
}
char test(char string[])
{
string[1] = 'r';
return 0;
}

那好,既然形参实参两者的类型不同,那么我就在函数的形参中定义一个数组:char string[256];
现在编译完全OK,那么运行结果会是什么呢?



结果是a。事实上这样返回的是一个a[0]元素。
那么,将函数改为:char test(char string[])
{
string[0] = 'r';
return 0;
}结果如何呢?



结果仍然是a,并没有改变。
所以在此情形中,return 0,既是返回到实参数组的第一个元素。至于return 1,2,3,4..是什么大家可以自己试试。int test(int string[]);
int main()
{
int a[] = {1,2,3};
printf("%d\n", test(a));
return 0;
}
int test(int string[])
{
string[2] = 2;
return 3;
}
但将程序全部改为int型时,输出又有点不同:



输出的都是 return N ,N的值。
所以由此可见,在传值调用函数到最后离开函数时,真正有作用的值,是return 到的那个值。
//***********************************************************************************************************
正确的写出return 值  和   匹配实参形参的类型,是在编写函数及调用函数时必须的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: