数组形参

来源:互联网 发布:移动网络玩dota2 编辑:程序博客网 时间:2024/05/05 00:16

http://blog.163.com/mageng11@126/blog/static/1408083742011424135666/

附上链接内容:

在 C++中,数组永远不会按值传递,它是传递第一个元素,准确地说是第 0个 的指针

例如,如下声明 :
void putValues( int[ 10 ] ); 
被编译器视为  
void putValues( int* ); 
数组的长度与参数声明无关,因此,下列三个声明是等价的: 
// 三个等价的 putValues()声明 
void putValues( int* ); 
void putValues( int[] ); 
void putValues( int[ 10 ] ); 

 

因为数组被传递为指针 所以这对程序员有两个含义:

 
1. 在被调函数内对参数数组的改变将被应用到数组实参上而不是本地拷贝上,当用作实参的数组必须保持不变时,程序员需要保留原始数组的拷贝函数可以通过把参数类型声明为 const 来表明不希望改变数组元素
void putValues( const int[ 10 ] ); 

2.  数组长度不是参数类型的一部分,函数不知道传递给它的数组的实际长度,编泽器也不知道,当编译器对实参类型进行参数类型检查时,并不检查数组的长度。例如: 
void putValues( int[ 10 ] ); // 视为 int* 
 
int main() { 
int i, j[ 2 ]; 
putValues( &i ); // ok: &i 是 int*; 潜在的运行错误 
putValues( j ); // ok: j 被转换成第 0 个元素的指针 
// 实参类型为 int*: 潜在的运行错误 
return 0; 

参数的类型检查只能保证putValues()的两次调用都提供了int*型的实参,类型检查不能检验实参是一个 10元素的数组 。习惯上, C风格字符串是字符的数组,它用一个空字符编码作为结尾。但是所有其他类型,包括希望处理内含空字符的字符数组必须以某种方式在向函数传递实参时使其知道它的长度。

 

一种常见的机制是提供一个含有数组长度的额外参数。例如: 
void putValues( int[], int size ); 
int main() { 
       int i, j[ 2 ]; 
       putValues( &i, 1 ); 
       putValues( j, 2 ); 
       return 0; 
}

 

另外一种机制是将参数声明为数组的引用

当参数是一个数组类型的引用时,数组长度成为参数和实参类型的一部分,编译器检查数组实参的长度与在函数参数类型中指定的长度是否匹配。  
// 参数为 10 个 int 的数组 
// parameter is a reference to an array of 10 ints 
void putValues( int (&arr)[10] ); //不能写成&arr[10],因为下标操作符的优先级较高
int main() { 
       int i, j[ 2 ]; 
       putValues( i ); // 错误: 实参不是 10 个 int 的数组 
       putValues( j ); // 错误: 实参不是 10 个 int 的数组 
       return 0; 
}




链接中有对数组做形参的一些深入解释,在此基础上自己做以下补充:

1.声明数组为引用类型的时候,必须得注明数组的大小,因为这样函数才能根据此大小与实参对比,看实参长度是否符合要求的大小。

2.void Ha(int a[])和void Ha(int a[128])一样,传递的都是指针。对于以下代码:

void Ha(int a[])
{
      cout<<sizeof(a);
}


int _tmain(int argc, _TCHAR* argv[])
{

        int arr[128];
        Ha(arr);
        system("PAUSE");
        return 0;
}

将会输出4而不是512,因为在32位机上,指针占4个字节,而64位机上,则会输出8了。但是如果int a[]改为int (&a)[128],则会输出512了。

3.当然并不是所有情况下,数组都会被隐式转化为指针的,其中包括数组用作取地址操作符&的操作数时或者sizeof操作符的操作数,或者用于对数组的引用进行初始化时。

说起数组引用,要特别注意注意数组引用的使用形式如下:

int (&a) [10]

注意括号和注明数组大小的“10”