C++中将二维数组(静态的和动态的)作为函数的参数传递

时间:2021-10-27 16:31:08

在C++编程中,我们经常将数组作为参数传递到另一个函数,数组的维数不同,传递方式也不同,此处将作一个总结,包括一维静态、动态数组,二维静态、动态数组。

一,一维数组(静态、动态一维数组)

1, 一维数组寻址形式:num[i]的地址:num+i,因此一维数组作为参数传递时候,只需要用数组名作为参数即可。

shuchu(num)
void shuchu(int num[])

2,一维数组实例:

#include <iostream>
using namespace std; void ces1(int *num)
{
for (int i = ; i < ; i++){
cout << num[i] << endl;
}
} void ces2(int *num, int m)
{
for (int i = ; i < m; i++){
cout << num[i] << endl;
}
} int main()
{
int num1[];
for (int i = ; i < ; i++){
num1[i] = i;
}
ces1(num1); int k = ;
int *num2 = new int[k];
for (int i = ; i < k; i++){
num2[i] = i + ;
}
ces2(num2, k);
delete[] num2; return ;
}

二,二维数组

1,静态二维数组利用数组名和第二维大小作为参数

(1)二维数组如下int num[M][N],二维数组寻址形式:num[i][j]的地址:num+i*N+j。由此可知二维数组作为参数传递时候,除了数组名作为参数,还需要数组第二维的大小,第一维随意。

二维数组实参:

shuchu(num);

二维数组形参二种形式皆可:

void shuchu(num[][]);
void shuchu(num[][]);

(2)二维数组实例:

#include <iostream>
using namespace std; void ces(int num[][]) //这样可以
//void ces(int num[][5]) //这样可以
//void ces(int num[5][]) //这样不可以
{
for (int i = ; i < ; i++){
for (int j = ; j < ; j++){
cout<<num[i][j]<<" ";
}
cout<<endl;
}
} int main()
{
int num[][];
for (int i = ; i < ; i++){
for (int j = ; j < ; j++){
num[i][j] = i * j;
}
}
ces(num);
return ;
}

2,动态二维数组利用二维指针传递数组参数

(1),我们知道动态二维数组的第一维和第二维都是变量,因此我们利用"数组名和二维大小作为形参"这种方式失效,此处必须利用二维指针。

二维数组实参:

shuchu(num);

二维指针作为形参:

void shuchu(int **num)

二维数组在子函数中使用方式:

num[i][j]即可

3,静态二维数组也可用二维指针。

二维数组实参:

shuchu((int **)num);     //此处需要强制转化

二维指针作为形参:

void shuchu(int **num)

二维数组在子函数中使用方式:

这样是不对的:  num[i][j]
必须这样: *((int *)num+*i+j) 或
((int *)num+*i)[j]

4,下面给出了二维静态数组和动态数组的两个实例,有两处不同,在程序中用红色标识了

//二维静态数组
#include <iostream>
using namespace std; void ces(int **num)
{
for (int i = ; i < ; i++){
for (int j = ; j < ; j++){
cout<<*((int *)num+*i+j)<<" "; //这样可以
// cout<<((int *)num+5*i)[j]<<" "; //这样可以
// cout<<num[i][j]<<" "; //这样不可以
}
cout<<endl;
}
} int main()
{
int num[][];
for (int i = ; i < ; i++){
for (int j = ; j < ; j++){
num[i][j] = i * j;
}
}
ces((int **)num); //这样可以
// ces(num); //这样不可以
return ;
}
//二维动态数组
#include <iostream>
using namespace std; void ces(int **num, int m, int n)
{
for (int i = ; i < m; i++){
for (int j = ; j < n; j++){
// cout<<*((int *)num+5*i+j)<<" "; //这样不行
// cout<<((int *)num+5*i)[j]<<" "; //这样不行
cout<<num[i][j]<<" "; //这样可以
}
cout<<endl;
}
} int main()
{
int m = , n = , i, j;
int **num = new int*[m];
for (i = ; i < m; i++)
{
num[i] = new int[n];
}
for (i = ; i < m; i++){
for (j = ; j < n; j++){
num[i][j] = i * j;
}
}
ces(num, m, n); //这样可以 // ces((int **)num, m, n); //这样可以
for (i = ; i < m; i++)
{
delete[] num[i];
}
delete[] num;
return ;
}