以数组名作为作为函数参数的具体含义如下,
(1)用数组元素作实参时,只要数组类型和函数的形参变量的类型一致,那么作为下标变量的数组元素的类型也和函数形参变量的类型是一致的。因此,并不要求函数的形参也是下标变量。换句话说,对数组元素的处理是按普通变量对待的。用数组名作函数参数时,则要求形参和相应的实参都必须是类型相同的数组,都必须有明确的数组说明。当形参和实参两者类型不一致时,机会发生错误。
(2)在用数组名做函数参数时,不是进行值的传递,即不是把实参数组的每一个元素的值都赋予形参数组的各个元素。用普通变量或下标变量作函数参数时,形参变量和实参变量都是由编译系统分配的两个不同的内存单元。在函数调用时进行的值传递是把实参变量的值赋予形参变量。因为实际上形参数组并不存在,编译系统不为形参数组分配内存。那么,数据的传递是如何实现的?因为数组名就是数组的首地址。因此用数组名做函数参数时所进行的传递实际上是地址的传递,也就是把实参数组的首地址赋予形参数组名。形参数组名取得该首地址后,也就等于有了具体的地址。实际上是形参数组和实参数组为同一数组,共同使用一段内存空间。
此外,需注意以下几点,
(1)如果形参是数组形式,则实参必须是实际的数组名,如果实参是数组名,则形参可以是同样维数的数组名或指针。
(2)要在主调函数和被调函数中分别定义数组。
(3)实参数组和形参数组必须类型相同,形参数组可以不指明长度。
(4)在C语言中,数组名除作为变量的标识符之外,数组名还代表了该数组在内存中的起始地址,因此,当数组名作函数参数时,实参与形参之间不是"值传递",而是"地址传递",实参数组名将该数组的起始地址传递给形参数组,两个数组共享一段内存单元,编译系统不再为形参数组分配存储单元。
数组作函数形参,函数可以写:
(1)void Evaiuate(int iArrayName[10]){};
(2)void Evaiuate(int iArrayName[]){};
调用:
int iArray[10]={1,2,3,4,5,6,7,8,9,10};
(1) Evaiuate( iArrayName); // 实参只需写数组名, 同一类型,数组大小必须同形参一样是10。
(2) Evaiuate( iArrayName); // 实参只需写数组名, 同一类型。
--------
函数形参是指针,实参可以是数组
void Evaiuate(int *p) {}
调用:
int iArray[10]={1,2,3,4,5,6,7,8,9,10};
Evaiuate(iArray) ; //用数组首地址调用
Evaiuate(&iArray[0]) ; //用数组第一个元素的地址调用
函数名相当于指针,
void Evaiuate(int iArrayName[10])相当于
void Evaiuate(int* iArrayName)
下标没有意义,在函数体中不能使用