函数调用常规二维数组和动态二维数组的差异
2015-09-06 14:19
495 查看
博客的内容分为两个部分,第一部分解释了函数调用常规二维数组的格式,主要参照的是《C++ Prime Plus》中的7.4节。第二部分解释了动态二维数组的初始化方法,以及函数调用动态二维数组的格式。
形参的格式较为复杂,因为形参需要指出该参数是一个指向数组的指针,该数组由4个int类型的值组成。还有另外一种形参格式,也能说明形参是一个指向4个int值组成数组的指针。
实参的格式比较简单,只需要把数组名当作地址传递,由于形参中数组名已经传递了数组的列数,所以还需要传递数组的行数。
首先,我们看看如何用new来开辟二维数组的内存。我们知道,用new来开辟的一维数组的内存,会将该内存的地址返回,并赋给一个指针变量,比如:
也就是说,用new开辟的内存保存在指针变量中。
二维数组的数组名是一个二层指针。分为两步开辟内存。第一步开辟指针类型、长度为rows的内存空间,把地址值赋给arr。第二步时对于每一个arr[i],开辟int类型,长度为cols的内存空间,把地址值赋给arr[i],arr[i]是个一层指针。永远要记住,在用new开辟内存的同时,使用delete对内存进行释放。释放也分为两个步骤,第一步,先释放每一个arr[i]位置的内存,第二步释放arr位置的内存。
在用new开辟好二维数组的内存空间之后,下面来解释动态数组实参和新参的格式。形参则需要表明数组名是一个二层指针,由于该指针没有说明数组的行数和列数,所以还需要传递行数和列数。实参依旧是使用数组名当作地址。
第一部分:
首先,我们来看函数在调用常规二维数组过程中,实参和形参的格式。以一个二维数组求和的函数为例。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开辟好二维数组的内存空间之后,下面来解释动态数组实参和新参的格式。形参则需要表明数组名是一个二层指针,由于该指针没有说明数组的行数和列数,所以还需要传递行数和列数。实参依旧是使用数组名当作地址。
相关文章推荐
- iOS包管理工具Cocoapods的安装与使用
- 栈的压入、弹出序列
- 一个游戏数值策划的自白:我所理解的数值工作
- tomcat记录控制台输出信息至文件
- (android高仿系列)今日头条 --新闻阅读器 (三) 完结 、总结 篇
- 通过NSString初始化OC类
- php数组与字符串的转换
- Bestcoder#54 A problem of sorting
- 性能安全之新安装的MySQL必须调整的10项配置
- 静态链表实现
- 浙江大学PAT_甲级_1052. Linked List Sorting (25)
- php xss filter
- Action Recognition with Trajectory-Pooled Deep-Convolutional Descriptors
- 你想学好rails+vim+ruby+titanium等等成为全栈工程师牛人么?这里是牛人博客网站地址
- Hdu5429,数学+高精度+等比序列判断
- 1067. Sort with Swap(0,*) (25)
- mysql导入与导出sql文件指令
- 如何在Linux上运行Mono
- xeno 实时性能测试 在100us的采样周期的测试数据
- ER 图