一、数组元素作为实参
由于实参可以是表达式,而数组元素可以是表达式的组成部分,因此数组元素当然可以作为函数的实参,与用变量作实参一样,是单向传递,即“值传送”方式。
注意
该方式下被调函数的值改变不能引起主调函数的值发生改变
二、数组名作为实参
可以用数组名作函数参数,此时形参应当用数组名或用指针变量
注意
- 用数组名作函数参数,应该在主调函数和被调用函数分别定义数组,例中array是形参数组名,score是实参数组名,分别在其所在函数中定义,不能只在一方定义。
- 实参数组与形参数组类型应一致,如不一致,结果将出错
- 在被调用函数中声明了形参数组的大小为10,但在实际上,指定其大小是不起任何作用的,因为C语言编译对形参数组大小不做检查,只是将实参数组的首元素的地址传给形参数组。因此,形参数组名获得了实参数组的首元素的地址。因此,形参数组首元素(array[0])和实参数组首元素(score[0])具有同一地址,它们共占同一存储单元,因此对被调函数的修改也可以改变主调函数。
- 形参数组可以不指定大小,在定义数组时在数组名后面跟一个空的方括号。有时为了在被调用函数中处理数组元素的需要,可以另设一个形参,传递需要处理的数组元素的个数。
三、字符数组
3.1 一维数组名传参
字符数组进行传参的时候不需要,传入数组的大小,因为字符串数组自带的结束符\0,当有该字符时候,字符数组自动结束
注意常见错误
1、sizeof() 与预想结果不一样
如下图所示
原因如下
不一样的原因,偷换概念,sizeof更感兴趣的是数据类型的类型名。对第二个,他看的是类型 char [100]。而对于第一个是传参传的是一个值,不是他的类型。故两者不相同。
3.2 二维整形数组名传参
1、多维数组元素可以作函数参数,这点与前述的情况类似。
2、可以用多维数组名作为函数的实参和形参,在被调用函数中对形参数组定义时可以指定每一维的大小,也可以省略第一维的大小说明。
比如,int array[3][10] 或 int array[ ][10];二者都合法而且等价。但是不能把第二维以及其他高维的大小说明省略。如下面的定义是不合法的:int array[ ][ ];
注意
在第二维大小相同的前提下,形参数组的第一维可以与实参数组不同。例如,实参数组定义为
int score[5][10];而形参数组定义为int array[3][10];这时形参数组和实参数组都是由相同类型和大小的一维数组组成的。C语言编译系统不检查第一维的大小。
3.3 字符串数组名传参
字符串数组名传参和整形数组名传参的过程以及程序格式要求是一致的。相同格式要求。
四、学习过程中函数的定义
注意主调函数和被调函数的传参过程中的格式要求,主调函数传数组的时候只需要传数组名即可,不要写成数组元素的形式,这是传进去的是数组元素,而不是数组地址。
void reverseStrings(char s[][100], int rows)
{
int i;
for(i = 0;i < rows / 2;++i)
{
char t[100];
strcpy(t,s[rows - i - 1]);
strcpy(s[rows - i - 1],s[i]);
strcpy(s[i],t);
}
}
maxOfTheArray2D(a,rows)