C++二维数组(指针)做参数
一、问题描述
使用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; }
注意:
1.程序在执行完相关功能应释放申请过的内存,虽然程序结束时操作系统会自动清除,但对于需要长时间运行的程序来说如果不及时释放内存的话程序的运行效率会越来越低,严重
甚至占用完绝大部分系统内存,印象其它程程序的运行。
2.在初始化二维指针时,形式参数传值应实用C++中的引用,否则申请到的内存也只能用于局部函数,起不到初始化二维指针的效果。引用实际上是将实参的地址直接传入到局部函
数中进行运算。
三、参考
【推荐】FFA 2024大会视频回放:Apache Flink 的过去、现在及未来
【推荐】中国电信天翼云云端翼购节,2核2G云服务器一口价38元/年
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [杂谈]如何选择:Session 还是 JWT?
· 硬盘空间消失之谜:Linux 服务器存储排查与优化全过程
· JavaScript是按顺序执行的吗?聊聊JavaScript中的变量提升
· [杂谈]后台日志该怎么打印
· Pascal 架构 GPU 在 vllm下的模型推理优化
· WinForm 通用权限框架,简单实用支持二次开发
· 如何为在线客服系统的 Web Api 后台主程序添加 Bootstrap 启动页面
· 硬盘空间消失之谜:Linux 服务器存储排查与优化全过程
· 面试官:DNS解析都整不明白,敢说你懂网络?我:嘤嘤嘤!
· 双语对照的 PDF 翻译工具「GitHub 热点速览」