一、问题描述

    使用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. Hbase 三维存储

    hbase所谓的三维有序存储的三维是指:rowkey(行主键),column key(columnFamily+qualifier),timestamp(时间戳)三部分组成的三维有序存储. 1.row ...

  2. SpringBoot_02通用mapper

    注意:一旦引入了通用Mapper的启动器,会覆盖Mybatis官方启动器的功能,因此需要移除对官方Mybatis启动器的依赖. 无需任何配置就可以使用了.如果有特殊需要,可以到通用mapper官网查看 ...

  3. 深入解析Vue.js中v-bind v-model的使用和区别

    v-model 指令在表单控件元素上创建双向数据绑定,所谓双向绑定,指的就是我们在js中的vue实例中的data与其渲染的dom元素上的内容保持一致,两者无论谁被改变,另一方也会相应的更新为相同的数据 ...

  4. day 02 while 循环 格式化输出 运算符 and or not - 编码的初识

    while 循环 while 条件:    循环体 循环如何终止? 改变条件. flag = Truewhile flag:    print('狼的诱惑')    print('我们不一样')   ...

  5. php文件上传客户端限制和服务器端限制

    客户端限制 1,通过表单隐藏域限制文件上传文件的最大值<input type='hidden' name='MAX_FILE_SIZE' VALUE='字节数' />通过accept属性限 ...

  6. [wpf] collectionViewsource 排序 和分组

    xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase" xmlns:swd="clr-n ...

  7. [React] react-interview-01

    1.render 函数中 return 如果没有使用()会有什么问题? 我们在使用 JSX 语法书写 react 代码时,babel 会将 JSX 语法编译成 js,同时会在每行自动添加分号(:),如 ...

  8. Jdbc Driver驱动和ServerTimeZone时区的的问题

    一.JDBC驱动的版本号以及名称问题 区别: com.mysql.jdbc.Driver 是 mysql-connector-java 5中的 com.mysql.cj.jdbc.Driver 是 m ...

  9. Java的GUI框架如何选择? Swing、SWT、AWT、SwingX、JGoodies、JavaFX、Apache Pivot、BeautyEye框架(美观)?

    AWT 是swing的基础,运行良好,但缺少高级组件.如果您打算创建丰富的应用程序,那么AWT可能不是最好的方法.但是对于不需要丰富用户界面的较小gui应用程序来说.这可能非常适合,因为它是一个久经考 ...

  10. iOS-NSLog发布时取消打印日志

    1 选择工程的Target -> Build Settings -> Preprocessor Macros. 如图,默认 Debug项,是“DEBUG=1”. 2 在程序中设置全局宏定义 ...