【C++基础之十六】数组传参

来源:互联网 发布:保利地产待遇 知乎 编辑:程序博客网 时间:2024/05/16 07:34

1.一维数组

数组作为传参,其实传入的只是数组的首地址。实质上也是值拷贝。调用函数内部会有一个备份,这个备份指向了数组的首地址,所以数组元素可以在调用函数中被改变。由于调用函数只知道数组的首地址,并不知道数组元素的个数,所以一般我们将数组元素个数也传入。

第一种实现:

指定数组长度。

int sum(int array[3]);//指定数组长度int sum(int array[3]){int value=0;for(int i=0;i<3;i++){value+=array[i];}return value;}void _tmain(int argc, _TCHAR* argv[]){int array[3]={1,2,3};cout<<sum(array);}

第二种实现:

传入数组首地址和长度。

int sum(int array[],int n);//传入数组首地址和长度int sum(int array[],int n){int value=0;for(int i=0;i<n;i++){value+=array[i];}return value;}void _tmain(int argc, _TCHAR* argv[]){int array[3]={1,2,3};cout<<sum(array,3);}

第三种实现:

因为数组传参实际传入的也是指针,所以我们还可以这么写。

int sum(int *p,int n);//传入数组的首地址,即指针int sum(int *p,int n){int value=0;for(int i=0;i<n;i++){value+=*(p+i);}return value;}void _tmain(int argc, _TCHAR* argv[]){int array[3]={1,2,3};cout<<sum(array,3);}

2.多维数组

在内存中没有所谓的多维数组,它也是按照一维排列的。所以实质上传入的多维数组首地址其实也是指针。

第一种实现:

指定了行列数。

int sum(int array[2][2]);//指定数组的行列int sum(int array[2][2]){int value=0;for (int i=0;i<2;i++){for(int j=0;j<2;j++){value+=array[i][j];}}return value;}void _tmain(int argc, _TCHAR* argv[]){int array[2][2]={{1,2},{3,4}};cout<<sum(array);}

第二种实现:

指定列宽并且传入行数。注意,第二维必须指定!

int sum(int array[][2],int row);//指定列宽并传入行数int sum(int array[][2],int row){int value=0;for (int i=0;i<row;i++){for(int j=0;j<2;j++){value+=array[i][j];}}return value;}void _tmain(int argc, _TCHAR* argv[]){int array[2][2]={{1,2},{3,4}};cout<<sum(array);}

第三种实现:

传入数组首地址和行列数。当成一维数组来处理。

int sum5(int* p,int row,int col);//数组首地址和行列数int sum5(int* p,int row,int col){int value=0;for (int i=0;i<row;i++){for(int j=0;j<col;j++){value+=*(p+col*i+j);}}return value;}void _tmain(int argc, _TCHAR* argv[]){int array[2][2]={{1,2},{3,4}};cout<<sum(array);}

第四种实现:

传入行指针以及行数。

int sum(int (*array)[2],int row);//传入行指针和行数int sum(int (*array)[2],int row){int value=0;for (int i=0;i<2*row;i++){value+=(*array)[i];}return value;}void _tmain(int argc, _TCHAR* argv[]){int array[2][2]={{1,2},{3,4}};cout<<sum(array,2);}


原创粉丝点击