您的位置:首页 > 其它

函数调用常规二维数组和动态二维数组的差异

2015-09-06 14:19 495 查看
博客的内容分为两个部分,第一部分解释了函数调用常规二维数组的格式,主要参照的是《C++ Prime Plus》中的7.4节。第二部分解释了动态二维数组的初始化方法,以及函数调用动态二维数组的格式。

第一部分:

首先,我们来看函数在调用常规二维数组过程中,实参和形参的格式。以一个二维数组求和的函数为例。

include <iostream>
int mysum(int arr2dim[][4], int rows);//形参的格式
using namespace std;
int main(){
int arr2dim[3][4] = {{1,2,3,4},{5,6,7,8},{1,3,5,7}};
int sum = mysum(arr2dim,3);//实参的格式
return 0;
}
int mysum(int arr2dim[][4], int rows){
int tol = 0;
for (int i = 0;i < rows; i++)
{for (int j = 0;j < 4; j++)
{
tol += arr2dim[i][j];
}
}
return tol;
}


形参的格式较为复杂,因为形参需要指出该参数是一个指向数组的指针,该数组由4个int类型的值组成。还有另外一种形参格式,也能说明形参是一个指向4个int值组成数组的指针。

int mysum(int (*arr2dim)[4], int rows);//形参的格式


实参的格式比较简单,只需要把数组名当作地址传递,由于形参中数组名已经传递了数组的列数,所以还需要传递数组的行数。

第二部分:

以上就是函数调用静态数组时,实参和形参的格式。但如果是对于用new分配的动态数组,实参和形参的格式就会和上面的完全不同。依旧以二维数组求和为例。鉴于用new开辟二维数组的内存比较复杂,本文便先从这块讲解,粗斜体部分代码便是分别使用new和delete开辟和释放空间。

#include <iostream>
int mynewsum(int **arr, int rows, int cols);//形参格式
using namespace std;
int main()
{
//输入行数rows和列数
int rows = 0;
int cols = 0;
cin >> rows >> cols;
//用new根据输入的行数和列数构造动态数组
int **arr =new int *[rows];
for (int i = 0;i < rows; i++)
{
//arr[i]是一个指针变量
arr[i] = new int[cols];
}
//遍历输入每一个元素的值
for (int i = 0;i < rows; i++)
{
for (int j = 0;j < cols; j++)
{
cin >> arr[i][j];
}
}
//函数调用
int sum = mynewsum(arr,rows,cols);//实参格式

//delete并结束
for(int i = 0;i < rows;i++)
{
delete[] arr[i];
}
delete [] arr;
return 0;
}
int mynewsum(int **arr, int rows, int cols)
{
int tol = 0;
for (int i = 0;i < rows; i++)
{
for (int j = 0;j < cols; j++)
{
tol += arr[i][j];
}
}
return tol;
}


首先,我们看看如何用new来开辟二维数组的内存。我们知道,用new来开辟的一维数组的内存,会将该内存的地址返回,并赋给一个指针变量,比如:

int *p =new int
;


也就是说,用new开辟的内存保存在指针变量中。

二维数组的数组名是一个二层指针。分为两步开辟内存。第一步开辟指针类型、长度为rows的内存空间,把地址值赋给arr。第二步时对于每一个arr[i],开辟int类型,长度为cols的内存空间,把地址值赋给arr[i],arr[i]是个一层指针。永远要记住,在用new开辟内存的同时,使用delete对内存进行释放。释放也分为两个步骤,第一步,先释放每一个arr[i]位置的内存,第二步释放arr位置的内存。

在用new开辟好二维数组的内存空间之后,下面来解释动态数组实参和新参的格式。形参则需要表明数组名是一个二层指针,由于该指针没有说明数组的行数和列数,所以还需要传递行数和列数。实参依旧是使用数组名当作地址。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: