原创 数组做函数参数的情况

2009-11-9 11:37 2423 6 6 分类: 软件与OS
看下面的例子:
void Func(int arr[5])

{

   for(int i="0";i<5;i++)

     arr = i;

}
Func 函数的参数是: int arr[5]。 这是第一次接触使用数组作为参数。它表示在调用Func时,需要给这个函数一个大小为5的整型数组。

在这个参数里,我们没有看到“&”。似乎这应该是一个“传值”方式的参数,但错了,对数组作为参数,则固定是以传址方式将数组本身传给函数,而不是传数组的复制品。

为什么要有这样一个例外?首先是出于效率方面的考虑。复制数组需要的时间可能和复制一个简单变量没有区别:比如这个复制就只有一个元素: int arr[1]; 但如果这个数组是1000个,或50000个元素,则需要较长的时间,对于C,C++这门追求高效的语言,太不合算。

接着从第二点上说:“数组本身就是内存地址”,也正好说明了这一点,数组作为函数的参数,传的是“地址”,并且不需要加‘&’符号来标明它是一个传址方式的参数,因为,“数组本身就是内存地址”。

如果在main()函数中调用FUNC()
void main()
{
   int a[5];
   func(a);
}
那么数组a的各元素值为0,1,2,3,4


我们定义一个数组变量时,需要告诉编译器该数组的大小(直接或间接地指定)。但在声明一个函数的数组参数时,可以不指定大小。

 



声明一个函数时:

void Func(int arr[]);

及在定义它时:

void Func(int arr[])

{

...

}

 

上面中的参数:int arr[]。没有指定数组arr的大小。这样做的好处是该函数原来只能处理大小固定是5的数组,现在则可以处理任意大小的整型数组。

当然,对于一个不知大小的数组,我们处理起来会胆战心惊,因为一不小心就会越界。一般的做法是再加一个参数,用于在运行时指定该数组的实际大小:

 

void Func(int arr[], int size)

{

    for(int i="0";i<size;i++)

       arr = i;

}

 

现在这个函数可以处理任意大小的数组,很方便。

 

int a[5],b[10],c[100];

 

Func(a,5);

Func(b,10);

Func(c,100);

 

你还可以根据需要,指定一个比数组实际大小要小的size值。比如我们只想让Func函数处理c数组中的前50个元素:

Func(c,50);

 

说完“数组参数可以不指定大小”这一规定的好处,我们再来说这一规定的技术原理。其实说这是一项“规定”,其实说法不合理。只有那些解释性的语言 (如BAISC)才会有各种规定,对于C++这样一门既灵活又严谨的,纯编译型的语言,当它的语法规定下来后,就会自然而然地产生一些特性——是语言自身 实现的特性,而不是人为规定。

 

前面说数组做为函数参数,使用的是“传址”方式。由于传递的是数组的地址,而不是数组的所有元素,所以函数可以不知道该数组的实际大小。
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /3 下一条