一、问题描述

    使用C++编程过程中经常需要使用到二维数组,然而初级程序员在使用过程中经常会出错使程序崩溃。下面就二维指针的定义,初始化,以及二维指针做参数给出简单介绍。

  1.二维数组的定义与初始化

    在实际使用数组的时候往往开始不知道二维数组的行数和列数,因此程序需要根据用户输入动态定义二维数组的行和列。这里通过C++二级指针来实现,引入变量 int rowNum 行

  数, int coluNum 列数, char **p 二维字符数组,这里假定二维字符数组中的字符只能为'0'和'1'。

int **ary = new char*[rowNum];
for(int i = ; i < rowNum; ++i)
ary[i] = new char[colNum];

  2.二级指针内存的释放

    二级指针内存的释放和内存的申请类似,具体代码如下。

for(int i=;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=;i<rowNum;i++)
{
for(int j=;j<coluNum;j++)
{
if(p[i][j]=='')
{
p[i][j]='';
}
else
{
p[i][j]='';
}
}
}
} //从控制台获取二维数组p的初始值
void get_p(char **p,int *rowNum,int *coluNum)
{
for(int i=;i<*rowNum;i++)
{
for(int j=;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=;i<*rowNum;i++)
{
p[i]=new char[*coluNum];
}
} //打印二维数组
void print_p(char**p,int rowNum,int coluNum)
{
cout << "\n------------------------" << endl;
for(int i=;i<rowNum;i++)
{
for(int j=;j<coluNum;j++)
{
cout << p[i][j] << " ";
}
cout << endl;
}
} //释放内存
void destory_p(char**&p;int rowNum,int coluNum)
{
for(int i=;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 ;
}

  注意:

    1.程序在执行完相关功能应释放申请过的内存,虽然程序结束时操作系统会自动清除,但对于需要长时间运行的程序来说如果不及时释放内存的话程序的运行效率会越来越低,严重

  甚至占用完绝大部分系统内存,印象其它程程序的运行。

    2.在初始化二维指针时,形式参数传值应实用C++中的引用,否则申请到的内存也只能用于局部函数,起不到初始化二维指针的效果。引用实际上是将实参的地址直接传入到局部函

  数中进行运算。

   三、参考

  stack overflow

  

C++二维数组(指针)做参数的更多相关文章

  1. C-指针,二级指针,二维数组作为函数参数使用,C语言链表(详解)

    一级指针 int *p;            //表示定义一个int型(4字节)的指针p &p                 //表示p自身的地址位置 p                  ...

  2. C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

    原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...

  3. C语言二维数组作为函数参数

    设有整型二维数组a[3][4]如下:0   1   2   34   5   6   78   9  10  11 它的定义为:    int a[3][4]={{0,1,2,3},{4,5,6,7} ...

  4. c语言中数组,指针数组,数组指针,二维数组指针

    1.数组和指针 ] = {,,,,};// 定义数组 // 1. 指针和数组的关系 int * pa = array; pa = array; // p[0] == *(p+0) == array[0 ...

  5. C语言数组篇(五)多级指针和二维数组指针的区别

    多级指针   以二级指针为例 二级指针的由来是 指针数组 的指针形式. int *p[10] 读取的顺序是 p[] --> 10个空间的数组 * p[] --> 这10个空间的数组里面存放 ...

  6. C语言指针系列 - 一级指针.一维数组,二级指针,二维数组,指针数组,数组指针,函数指针,指针函数

    1. 数组名 C语言中的数组名是一个特殊的存在, 从本质上来讲, 数组名是一个地址, 我们可以打印一个指针的值,和打印一个数组的值来观察出这个本质: int nArray[10] ={ 0 }; in ...

  7. C语言中将二维数组作为函数参数来传递

    c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度. 例如: #include <stdio.h> void func(int n, char ...

  8. (一)二维数组&&指针数组与数组指针

    一.首先我们从字面意思理解一下什么是指针数组什么是数组指针 1.指针数组:本质是一个数组,数组中的每一个元素是一个指针. 2.数组指针:本质是一个指针,而指针指向一个数组. 二.我们该怎么区分指针数组 ...

  9. ANSI C遍历二维数组指针地址

    #include <stdio.h> int main() { ][] = {,,,}; //等价于{{1,2},{3,4}}; ; i < ; i++) { ; j < ; ...

  10. 【转】C++动态创建二维数组,二维数组指针

    原作者博客:蒋国宝的IT技术博客 今天完成一道题目需要自己用指针创建一个二维的数组,不得不承认指针的确是恶心. int **result; ; ; result = new int*[row]; ; ...

随机推荐

  1. [转帖]影驰首发PCIe 4.0 SSD:群联AMD合作主控飚出5GB/s

    影驰首发PCIe 4.0 SSD:群联AMD合作主控飚出5GB/s https://www.cnbeta.com/articles/tech/851275.htm 硬件发展的真快.. AMD刚刚发布的 ...

  2. Python3.7 下安装pyqt5

    第一步:首先进入python安装目录下的 [scripts]. 第二步:执行安装pyqt5的命令:python37 -m pip install pyqt5 出现以下安装过程代表安装成功. 第三步:在 ...

  3. WebService概念解释

    一句话概括什么是WebService   WebService是一种跨编程语言.跨操作系统平台的远程调用技术. 远程调用技术:远程调用是指一台设备上的程序A可以调用另一台设备上的方法B.比如:银联提供 ...

  4. 【6.12校内test】T1单词序列

    [问题描述] 给出两个单词(开始单词和结束单词)以及一个词典.找出从开始单词转换到结束单词, 所需要的最短转换序列.转换的规则如下: 1.每次只能改变一个字母 2.转换过程中出现的单词(除开始单词和结 ...

  5. Qt两个类通过信号槽通信

    qt需要通过信号槽来通信,connect的时候总是返回false,请教了公司的一个小哥,才解决了问题,虽然是个很白痴的问题. bool b = QObject::connect(m_pCollectO ...

  6. noip2013day2-华容道

    题目描述 小 \(B\) 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用 编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多 少时间. 小 \(B ...

  7. ElasticSearch实战系列四: ElasticSearch理论知识介绍

    前言 在前几篇关于ElasticSearch的文章中,简单的讲了下有关ElasticSearch的一些使用,这篇文章讲一下有关 ElasticSearch的一些理论知识以及自己的一些见解. 虽然本人是 ...

  8. 084、Prometheus 到底NB在哪里?(2019-05-06 周一)

    参考https://www.cnblogs.com/CloudMan6/p/7709970.html   本节学习Prometheus的核心,多维数据模型   比如要监控容器 webapp1 的内存使 ...

  9. layui ri laydate的常规使用,并且日期最大不能超过当前日期

    laydate的常规使用,分为两种方式实现日期组件 一.在 layui 模块中使用 下载layui   地址 :https://www.layui.com/  引入资源路径 js 和 css 通过下面 ...

  10. laravel 学习之第一章

    LTS : long time support. download url : http://www.golaravel.com/download/ 第一篇 目录介绍: ​ resource:包含了原 ...