最近在学习数组的过程中,遇到了一系列的数组名作为函数参数的问题,并发现了很多有趣的现象。
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 值 和 匹配实参形参的类型,是在编写函数及调用函数时必须的。