数组名作为函数传递时的一些有趣现象
2018-02-09 17:34
225 查看
最近在学习数组的过程中,遇到了一系列的数组名作为函数参数的问题,并发现了很多有趣的现象。
1.char test(char string)
{
string[2] = 'r';
return 0;
}
这个函数首先是不能通过编译的,让我们看看错误提示:
(请先忽略掉return)
![](https://img-blog.csdn.net/20180209174008109?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWFVDSEVOMTIzMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
很明显,是我们的 函数的 形式参数 的类型与函数体中表达式所要“使用“的类型不同。我们往往心里知道,在调用函数时传递给函数的是一个数组,但实际上,我们定义的(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;
}
此时的错误信息是这样的:
![](https://img-blog.csdn.net/20180209174621279?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWFVDSEVOMTIzMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
很明显,实参(char a[]=...)是一个字符数组,也可以叫做“char *”型数组;而形参(char string)则是一个字符型“char”型变量。
所以,尽管我们心里知道string 是一个数组,并在调用时也确实将数组型的实参传递给它,但计算机并不这么认为。
计算机需要更为精确的说明。
2.
那好,既然形参实参两者的类型不同,那么我就在函数的形参中定义一个数组:char string[256];
现在编译完全OK,那么运行结果会是什么呢?
![](https://img-blog.csdn.net/20180209180118923?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWFVDSEVOMTIzMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
结果是a。事实上这样返回的是一个a[0]元素。
那么,将函数改为:char test(char string[])
{
string[0] = 'r';
return 0;
}结果如何呢?
![](https://img-blog.csdn.net/20180209181209573?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWFVDSEVOMTIzMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
结果仍然是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型时,输出又有点不同:
![](https://img-blog.csdn.net/20180209181710559?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWFVDSEVOMTIzMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
输出的都是 return N ,N的值。
所以由此可见,在传值调用函数到最后离开函数时,真正有作用的值,是return 到的那个值。
//***********************************************************************************************************
正确的写出return 值 和 匹配实参形参的类型,是在编写函数及调用函数时必须的。
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 值 和 匹配实参形参的类型,是在编写函数及调用函数时必须的。
相关文章推荐
- C++指针作为函数的参数进行传递时需要注意的一些问题
- 对象作为函数参数时调用拷贝构造函数、引用做函数参数时只是传递地址
- 神经网络中的激活函数——加入一些非线性的激活函数,整个网络中就引入了非线性部分,sigmoid 和 tanh作为激活函数的话,一定要注意一定要对 input 进行归一话,但是 ReLU 并不需要输入归一化
- 面试笔试系列3-指针作为函数参数传递
- 数组作为函数参数进行传递
- 如何将二维数组作为函数的参数传递
- c++之指针作为函数参数传递的问题
- 结构体指针作为函数参数传递却无法传值的有关问题
- 指针作为函数参数传递
- python 函数调用时传递参数的一些规范
- Python类的一些有趣的函数
- 如何将二维数组作为函数的参数传递
- 对象作为函数参数时调用拷贝构造函数、引用做函数参数时只是传递地址
- 随机产生一些数传递给一个函数,写程序找出并维护这些数的中位数
- C++中关于二维数组作为函数参数传递的问题
- C语言中将二维数组作为函数参数来传递
- 指针和引用作为函数传递参数
- 类的成员函数指针作为参数传递给其他函数和普通函数指针的传递是不同的
- c++中关于数组作为函数参数并传递数组元素个数的几种有效方法的讨论
- C语言技巧:怎样把数组作为参数传递给函数?