一、问题描述
使用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' 后输出。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#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; }
注意:
1.程序在执行完相关功能应释放申请过的内存,虽然程序结束时操作系统会自动清除,但对于需要长时间运行的程序来说如果不及时释放内存的话程序的运行效率会越来越低,严重
甚至占用完绝大部分系统内存,印象其它程程序的运行。
2.在初始化二维指针时,形式参数传值应实用C++中的引用,否则申请到的内存也只能用于局部函数,起不到初始化二维指针的效果。引用实际上是将实参的地址直接传入到局部函
数中进行运算。
三、参考