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

来源:互联网 发布:澳洲研究型硕士 知乎 编辑:程序博客网 时间:2024/06/10 05:13

      博客的内容分为两个部分,第一部分解释了函数调用常规二维数组的格式,主要参照的是《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 [N];

   也就是说,用new开辟的内存保存在指针变量中。
   二维数组的数组名是一个二层指针。分为两步开辟内存。第一步开辟指针类型、长度为rows的内存空间,把地址值赋给arr。第二步时对于每一个arr[i],开辟int类型,长度为cols的内存空间,把地址值赋给arr[i],arr[i]是个一层指针。永远要记住,在用new开辟内存的同时,使用delete对内存进行释放。释放也分为两个步骤,第一步,先释放每一个arr[i]位置的内存,第二步释放arr位置的内存。
   在用new开辟好二维数组的内存空间之后,下面来解释动态数组实参和新参的格式。形参则需要表明数组名是一个二层指针,由于该指针没有说明数组的行数和列数,所以还需要传递行数和列数。实参依旧是使用数组名当作地址。

0 0