一、问题描述

    使用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. [codeforces#592Div2]C-G题

    题目链接 感觉这场难度迷茫,个人觉得难度排序为$A<B<D=E=G<C<F$ C题: 比赛结束1500+pp,结果出分900+fst,我就是fst的睿智Orz. 题意为给出$n ...

  2. map的常见用法

    map的常见用法 map 是什么? map是一组键值对的组合,通俗理解类似一种特殊的数组,a[key]=val,只不过数组元素的下标是任意一种类型,而且数组的元素的值也是任意一种类型.有点类似pyth ...

  3. win7启动tomcat失败处理

    本地启动tomcat 后访问 127.0.0.1:8080 失败,查看错误如下 使用如下命令杀死占用8080的进程 netstat -ano | findstr 8080 # 查看8080端口状态 t ...

  4. 01:kubernetes基础

    1.1kubernetes简介   参考博客:https://www.kubernetes.org.cn/k8s 1.kubernetes介绍 1. Kubernetes是容器集群管理系统,是一个开源 ...

  5. Linux免密登陆设置了免密登陆为啥还需要输入密码

    一.设置了免密码登陆但是还是需要输入密码: 权限保证:1.authorized-keys 的权限为 600 2.home.账户所在的目录如hadoop..ssh这三个文件的权限都必须设置为700,缺少 ...

  6. ubuntu下python3虚拟环境的配置

    安装相关包 sudo pip3 install virtualenv # 虚拟环境包 sudo pip3 install virtualenvwrapper # 虚拟环境管理包 创建虚拟环境目录 su ...

  7. SQL注入的一些技巧分享

    先上一道简单的ctf注入题: 一道利用order by进行注入的ctf题 很不错的一道利用order by的注入题,之前不知道order by除了爆字段还有这种操作. 原题地址:http://chal ...

  8. JSP的9大内置对象和4打作用域对象

    一.9大内置对象 二.4大内置作用域对象

  9. VMware 问题

    桥接模式下,小鸡上不了网问题 多网卡导致的问题 解决:编辑-虚拟网络编辑器 选择vmnet0,然后点击右下角更改设置 把自动改为指定要桥接的网卡,然后点击确定,测试看看.

  10. 008-zabbix监控nginx

    (1)agent端配置 1)nginx编译安装需要加上该选项--with-http_stub_status_module 2)修改nginx配置文件 #vim /usr/local/nginx/con ...