C++二维数组(指针)做参数
2016-03-19 23:21
357 查看
一、问题描述
使用C++编程过程中经常需要使用到二维数组,然而初级程序员在使用过程中经常会出错使程序崩溃。下面就二维指针的定义,初始化,以及二维指针做参数给出简单介绍。
1.二维数组的定义与初始化
在实际使用数组的时候往往开始不知道二维数组的行数和列数,因此程序需要根据用户输入动态定义二维数组的行和列。这里通过C++二级指针来实现,引入变量 int rowNum 行
数, int coluNum 列数, char **p 二维字符数组,这里假定二维字符数组中的字符只能为'0'和'1'。
2.二级指针内存的释放
二级指针内存的释放和内存的申请类似,具体代码如下。
二、例程描述
下面给出一个例程,程序根据用户输入的 rowNum 行数, coluNum 列数,以及各个二维数组各个节点的值(假设输入的值只有字符 '0' 和 '1') ,然后调用函数 f 将,'0' 换
成 '1' , '1'换成 '0' 后输出。
View Code
注意:
1.程序在执行完相关功能应释放申请过的内存,虽然程序结束时操作系统会自动清除,但对于需要长时间运行的程序来说如果不及时释放内存的话程序的运行效率会越来越低,严重
甚至占用完绝大部分系统内存,印象其它程程序的运行。
2.在初始化二维指针时,形式参数传值应实用C++中的引用,否则申请到的内存也只能用于局部函数,起不到初始化二维指针的效果。引用实际上是将实参的地址直接传入到局部函
数中进行运算。
三、参考
stack overflow
使用C++编程过程中经常需要使用到二维数组,然而初级程序员在使用过程中经常会出错使程序崩溃。下面就二维指针的定义,初始化,以及二维指针做参数给出简单介绍。
1.二维数组的定义与初始化
在实际使用数组的时候往往开始不知道二维数组的行数和列数,因此程序需要根据用户输入动态定义二维数组的行和列。这里通过C++二级指针来实现,引入变量 int rowNum 行
数, int coluNum 列数, char **p 二维字符数组,这里假定二维字符数组中的字符只能为'0'和'1'。
int **ary = new char*[rowNum]; for(int i = 0; i < rowNum; ++i) ary[i] = new char[colNum];
2.二级指针内存的释放
二级指针内存的释放和内存的申请类似,具体代码如下。
for(int i=0;i<rowNum;i++) { delete[] p[i]; } delete []p;
二、例程描述
下面给出一个例程,程序根据用户输入的 rowNum 行数, coluNum 列数,以及各个二维数组各个节点的值(假设输入的值只有字符 '0' 和 '1') ,然后调用函数 f 将,'0' 换
成 '1' , '1'换成 '0' 后输出。
#include "iostream" using namespace std; //将0变成1,1变成0 void f(char **p,int rowNum,int coluNum) { for(int i=0;i<rowNum;i++) { for(int j=0;j<coluNum;j++) { if(p[i][j]=='0') { p[i][j]='1'; } else { p[i][j]='0'; } } } } //从控制台获取二维数组p的初始值 void get_p(char **p,int *rowNum,int *coluNum) { for(int i=0;i<*rowNum;i++) { for(int j=0;j<*coluNum;j++) { cin >> p[i][j]; } } } //初始化二维数组,即给指针p分配内存。这里注意要使用引用 void init_p(char**&p,int *rowNum,int *coluNum) { cin >> *rowNum >> *coluNum; p=new char*[*rowNum]; for(int i=0;i<*rowNum;i++) { p[i]=new char[*coluNum]; } } //打印二维数组 void print_p(char**p,int rowNum,int coluNum) { cout << "\n------------------------" << endl; for(int i=0;i<rowNum;i++) { for(int j=0;j<coluNum;j++) { cout << p[i][j] << " "; } cout << endl; } } //释放内存 void destory_p(char**&p;int rowNum,int coluNum) { for(int i=0;i<*rowNum;i++) { delete p[i]; } delete p; } int main(void) { int rowNum,coluNum; //指针的行和列 char **p; //二维指针 init_p(p,&rowNum,&coluNum); //初始化指针 get_p(p,rowNum,coluNum); //给指针赋值 print_p(p,rowNum,coluNum); //打印 f(p,rowNum,coluNum); //反转 0 和 1 print_p(p,rowNum,coluNum); //再次打印 destory_p(p,rowNum,coluNum) //释放内存 return 0; }
View Code
注意:
1.程序在执行完相关功能应释放申请过的内存,虽然程序结束时操作系统会自动清除,但对于需要长时间运行的程序来说如果不及时释放内存的话程序的运行效率会越来越低,严重
甚至占用完绝大部分系统内存,印象其它程程序的运行。
2.在初始化二维指针时,形式参数传值应实用C++中的引用,否则申请到的内存也只能用于局部函数,起不到初始化二维指针的效果。引用实际上是将实参的地址直接传入到局部函
数中进行运算。
三、参考
stack overflow
相关文章推荐
- python下调用c语言代码
- C++中有个malloc/free,为什么还需要new/delete?
- c++发展趋势
- C++ typeid实现原理
- 【2016/3】C++ 类与对象进阶 运算符重载 new delete 模板 继承
- 理解C++的RTTI
- 在C语言中,double、long、unsigned、int、char类型数据所占字节数
- C++ RTTI及“反射”技术
- C++11中的Move语义和右值引用
- 利用委托加观察者模式实现老板状态变化通知C++
- C++实验2-模拟ATM
- C语言之清空缓存区
- C++运算符优先级
- C++指针
- 哈希表的C++实现
- C++第二次实验1-标准体重
- 自己用C语言写PIC32单片机的serial bootloader
- 一起talk C栗子吧(第一百二十五回:C语言实例--显示文件名和行号)
- C语言的输入与输出
- c++第二次实验项目四