Bootstrap

函数中的数组参数


  

在c和c++中,数组作为函数的参数,要掌握以下几点:

1.数组作为参数时,退化为指针

数组参数不是按值传递,它是传递第一个元素(准确地说是第0个)的指针(即数组被传递为指针)。

例如,如下声明:

void putValues(int[10]); 被编译器视为:void putValues(int*);

C/C++数组参数的长度与参数声明无关。因此,下列三个声明是等价的:

void putValues(int*);  voidputValues(int[]);  void putValues(int[10]);

2.数组做参数时,函数不知道传递给它的数组的实际长度

编译器也不知道,当编译器对实参类型进行参数类型检查时,并不检查数组的长度。为使函数知道数组的长度,有三种方法:

(1)附带传递一个数组长度的参数,例如:

void putValues(int[], int size); //size为数组长度

(2)将参数声明为数组的引用(C++支持,C不支持)

当参数是一个数组类型的引用时,数组长度成为参数和类型的一部分,编译器检查数组实参的长度与在函数参数类型中指定的长度是否匹配。例如:

void putValues(int (&arr)[10]);
int main(){
  int i, j[2];
  int a[10];
  putValues(i); // 错误:实参不是10个int的数组
  putValues(j); // 错误:实参不是10个int的数组
  putValues(a); // 正确 
  return 0;
}

注:c不支持引用传递,不可以这么用,另外,对于C风格的字符串,不需要

(3)C风格字符串是字符的数组,它用一个空字符编码作为结尾,不需要单独指定长度。

3.函数可以通过把参数类型声明为const来表明不希望改变数组元素

在被调函数内对参数数组的改变将被应用到数组实参上,当用作实参的数组必须保持不变时,可将参数类型声明为const,防止数组元素被修改,例如:

void putValues(const int[10]);

4.二维数组作为行参时,函数的声明里必须指出第二维的大小

void Func(in
;