《数据结构与算法分析》课后题1.2求解字谜问题用到了二维数组,一涉及数组和指针,我就必出错,在这里总结一下二维数组的参数传递。

1、二维数组在内存中的存储

如果定义一个这样的二维数组int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};则其在内存中的表示可能下面这样的。

由上图可以看出,在内存中二维数组是按照行主序进行存储的,从内存的角度上看,二维数组本质就是一个一维数组。如果把二维数组的每一行看成一个整体,即看成一个数组中的一个元素,那么整个二维数组就是一个一维数组。而二维数组的名字代表二维数组第0行的首地址(注意它是代表一行元素的首地址,而不是第0行第0列元素的首地址,虽然是相等的,但不能这么理解,所以在没有强制转换的情况下,二维数据要么通过行指针进行参数传递,要么通过二维指针进行参数传递)。

2、二维数组在参数传递时的使用

数组名和函数名一样,可以当做指针(普通指针和函数指针)来用。
关于二维数组做为形参声明和实参传递,直接看代码:

第1种方式:传数组,第二维必须标明
void display(int arr[ ][4])

#include <iostream>2 using namespace std;3 4 /*传二维数组*/5 6 //第1种方式:传数组,第二维必须标明7 /*void display(int arr[][4])*/8 void display1(int arr[][4],const int irows)9 {10     for (int i=0;i<irows;++i)
11     {12         for(int j=0;j<4;++j)
13         {14             cout<<arr[i][j]<<" ";     //可以采用parr[i][j]
15         }
16         cout<<endl;
17     }
18     cout<<endl;
19 }

第2种方式:一重指针,传数组指针,第二维必须标明
void display(int (parr)[4])

//第2种方式:一重指针,传数组指针,第二维必须标明
22 /*void display(int (*parr)[4])*/
23 void display2(int (*parr)[4],const int irows)
24 {25     for (int i=0;i<irows;++i)
26     {27         for(int j=0;j<4;++j)
28         {29             cout<<parr[i][j]<<" ";    //可以采用parr[i][j]
30         }
31         cout<<endl;
32     }
33     cout<<endl;
34 }
35 //注意:parr[i]等价于*(parr+i),一维数组和二维数组都适用
36

第3种方式:传指针,不管是几维数组都把他看成是指针
void display3(int *arr)

//第3种方式:传指针,不管是几维数组都把他看成是指针
38 /*void display3(int *arr)*/
39 void display3(int *arr,const int irows,const int icols)
40 {41     for(int i=0;i<irows;++i)
42     {43         for(int j=0;j<icols;++j)
44         {45             cout<<*(arr+i*icols+j)<<" ";   //注意:(arr+i*icols+j),不是(arr+i*irows+j)
46         }
47         cout<<endl;
48     }
49     cout<<endl;
50 }

/*
54 //第2种方式:一重指针,传数组指针void display(int (*parr)[4])
55 //缺陷:需要指出第二维大小
56 typedef int parr[4];
57 void display(parr *p)
58 {
59     int *q=*p;        //q指向arr的首元素
60     cout<<*q<<endl;   //输出0
61 }
62
63 typedef int (*parr1)[4];
64 void display1(parr1 p)
65 {
66     cout<<(*p)[1]<<endl;  //输出1
67     cout<<*p[1]<<endl;    //输出4,[]运算符优先级高
68 }
69 //第3种方式:
70 void display2(int **p)
71 {
72     cout<<*p<<endl;           //输出0
73     cout<<*((int*)p+1+1)<<endl; //输出2
74 }
75 */
76
77 int main()
78 {79     int arr[][4]={0,1,2,3,4,5,6,7,8,9,10,11};
80     int irows=3;
81     int icols=4;
82     display1(arr,irows);
83     display2(arr,irows);
84
85     //注意(int*)强制转换.个人理解:相当于将a拉成了一维数组处理。
86     display3((int*)arr,irows,icols);
87     return 0;
88 }

推荐使用第二种方式
转自https://www.cnblogs.com/cygalaxy/p/6963789.html
转自https://www.cnblogs.com/bewolf/p/4321642.html

C++:二维数组参数传递相关推荐

  1. c++之二维数组参数传递

    背景 int a[2][2]={ {4, 6}, {9, 11} }; 我定义了这样一个数组,我想把这个数组作为参数,传递到一个函数中,并要在函数中能引用该二维数组的元素,我该怎么做? 第一种方式是直 ...

  2. java 二维数组参数传递_方法和数组就是这么简单!

    第三章 方法和数组 3.1 概述 还记得我们的HelloWorld例程吗?我们现在对于输出语句应该已经很熟悉了, 解释: System 是系统类. out 是标准输出对象 println() 是一个方 ...

  3. C语言学习笔记 (005) - 二维数组作为函数参数传递剖析

    前言 很多文章不外乎告诉你下面这几种标准的形式,你如果按照它们来用,准没错: //对于一个2行13列int元素的二维数组 //函数f的形参形式 f(int daytab[2][13]) {...}// ...

  4. 如何将二维数组作为函数的参数传递

    如何将二维数组作为函数的参数传递 声明: 如果你是得道的大侠,这篇文章可能浪费你的时间,如果你坚持要看,我当然感觉很高 兴,但是希望你看完了别骂我!如果你发现我这篇文章有错误的话,你可以提出批评以及 ...

  5. 【C++基础学习】二维数组的动态分配及参数传递

    1. C语言动态分配二维数组 (1)已知第二维 char (*a)[N];//指向数组的指针a = (char (*)[N])malloc(sizeof(char *) * m); printf(&q ...

  6. [原创]二维数组的动态分配及参数传递

    1. C语言动态分配二维数组 (1)已知第二维 Code-1 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(char *) * m); p ...

  7. 二维数组作为形参的参数传递问题[08-0704]-转

    2008-07-04 19:06 以下是网上摘抄的一段: 首先,我引用了谭浩强先生编著的<C程序设计>上面的一节原文,它简要介绍了如何将二维数组作为参数传递,原文如下(略有改变,请原谅): ...

  8. 二维数组名做参数传递问题

    在用二维数组名作为参数传递时容易出现Segmention Error.这是因为不能正确为二维数组中元素寻址的问题,正确的方法如下: 1. 用指向一维数组的指针变量,如下例子所示: #include & ...

  9. 二维数组作为函数的参数传递

    如何将二维数组作为函数的参数传递,这是涉及到多维数组时经常要遇到的问题.长期来,我们往往知其然,但不知其所以然.这里简单总结一下.     1.<C程序设计>中讲到:可以用二维数组名作为实 ...

最新文章

  1. 缓存穿透、并发和失效的解决方案
  2. ansible2.4 api调用
  3. 2020.3.10.遗留问题
  4. 对于机器学习中,数据增强
  5. Leetcode 77.组合
  6. 华为双11发 20 亿奖金!?
  7. python整形浮点型_Python3基础 | 整型浮点型
  8. 【Andorid学习】declare-styleable:自定义控件的属性
  9. Twisted入门教程(6)
  10. Ubuntu下apache启动出错:Permission denied: make_sock: could not bind to address
  11. h计算机二级基础知识题库,2020计算机二级Office考试题库真题
  12. TBase集群安装配置
  13. 确定性知识表示法--规则(产生式)表示法
  14. CocoaPods深入一点
  15. 今天是一位朋友的生日,送给她最美丽的祝福.
  16. ADB FORWARD
  17. OMNET随笔(初学感悟)
  18. Lucene.Net 实现搜索功能
  19. 张凤莲:换城市工作就一定要转移社保吗?
  20. 问责制Accountability

热门文章

  1. 检测乳腺癌细胞中的有丝分裂(3)
  2. 贝叶斯方法与Ridge回归的联系
  3. Unity Shader Graph 制作Grid网格效果
  4. Unity (一) 下载与安装
  5. 设计UI的语言——XAML
  6. tensorflow2.6.0+annconda4.10.1+cuda11.2+cudnn8.0+pycharm运行tensorflow-gpu版本·
  7. python的占位符%d %i %.nf %s
  8. QT遇到“常量中有换行符”的问题
  9. WordPress重要文件wp-seting.php文件详解
  10. 苹果手机小圆圈怎么设置_敬业签苹果手机版软件小账本怎么设置密码?