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

最近在学习数组的过程中,遇到了一系列的数组名作为函数参数的问题,并发现了很多有趣的现象。

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 值  和   匹配实参形参的类型,是在编写函数及调用函数时必须的。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值