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);
}