C++:二维数组参数传递

C/C++ 中二维数组的传递                                   C/C++ 中二维数组的传递 问题描述:于习题中碰到关于数组传递的问题,不熟悉相关。引发运行错误  二维数组传递的几种方式(1)       void function(char a[][20])  //数组名传递{…….}(2)              void function(c 阅读详情

《数据结构与算法分析》课后题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/C++】用指针实现二维数组的传递、使用的4种示例,及各种变形。 请看例程。 #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; /* *func1:用int a[]传递二维数组 *func2:用int a[][10]传递二维数组 *func3:用int *a[10]传递二维 *func4:用int (*a)[10]传递二维数组,但和func3不同,而与func2相同 */ int func1(in... 阅读详情

相关推荐

C/C++:使用二维数组名传参

在 C 中,当二维数组作为实参向形参传递时,会自动转化为指针类型,这时我们就不得不在传递形参时指明二维数组的第一维的长度,否则会导致编译错误。 但是这样的话,想使用二维数组名传参,而二维数组却又是动态的,也就是二维数组的维度是不确定的,这是如果我们想要将二维数组传递进一个函数,那我们得专门为不同维度长度的二维数组创建具有对应的形参的函数。这样太麻烦了。 而在 C++ 中,我们可以巧用模板来推导二维数组的类型(可以自动确定二维数组的维度长度),这样我们就可以做到直接使用二维数组名传参的函数,这样的话,尽管是对

英雄爱吃土豆片的博客 617

C++笔记 二维数组作为函数的参数详解 三种传参的方法总结 注意要点总结

//二维数组作为函数的参数,一般只有三种写法 //void array_print(int array[2][2]) ////函数的参数声明必须指明数组的列数,数组的行数没有太大关系,因为函数调用时传递的是一个指针,它指向由行向量构成的一维数组 //void array_print(int array[][2]) ////这种形式的函数参数是一个指针,它指向具有两个元素的一维数组 //void array_print(int(*array)[2])

weixin_40933653的博客 2万+

C++ 二维数组参数传递:5 种声明方式详解与编译期检查实践

本文详细解析了C++中二维数组参数传递的五种声明方式,包括指针数组、不完整数组类型、固定尺寸数组引用、模板化数组引用和指针的指针形式,并探讨了如何利用现代C++特性实现编译期维度检查。通过对比各种方式的性能与适用场景,为开发者提供了高效传递二维数组的实用建议。

weixin_30328063的博客 381

【C++】二维数组传参方式

本篇博客讲解了C语言和C++在二维数组传参方式上的不同,以及讲解了解决办法

EWIAW_ilove的博客 4783

C++ 二维数组参数传递:4 种声明方式的编译检查与内存布局分析

本文深入解析C++中二维数组参数传递的四种声明方式:`int (*arr)[N]`、`int arr[][N]`、`int arr[M][N]`及引用`int (&arr)[M][N]`,通过编译检查、内存布局分析和实际代码测试,揭示各方式的特性与适用场景,帮助开发者优化数组参数传递的效率和安全性。

weixin_33835103的博客 450

(信息学奥赛)信奥-CC++数组参数传递

访问方式:`*(*(arr + i) + j)`(指针偏移)或 `arr[i][j]`(数组下标)int arr2D_2x3[2][3] = {{1,2,3}, {4,5,6}};void print1DByRef(int (&arr)[5]) { // 引用一个长度为5的int数组。void print2DByRef(int (&arr)[3][3]) { // 引用3行3列的二维数组。

寒寒豆豆软件公司的博客 54

c/c++:二维数组作为参数传递

如何将二维数组作为函数的参数传递   今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不至于再在这上面浪费时间。 正文:     首先,我引用了谭浩强先生编著的《C程序设计》上面的一节原文,它简要介绍了如何 将二维数组作为参数传递,原文如下

JustTao_的专栏 568

易灵思Trion FPGA实战:5分钟搞定MIPI硬核配置(附Interface Designer避坑指南)

本文详细介绍了易灵思Trion FPGA中MIPI硬核的快速配置方法,通过Interface Designer工具实现从时钟配置到数据收发的全流程实战。特别针对初次接触Trion系列的设计师,提供了六个关键配置陷阱及解决方案,帮助开发者高效完成嵌入式视觉和高速数据传输项目。

eee77的博客 785

C++算法(22):二维数组参数传递,从内存模型到高效实践

本文深入探讨了C++中二维数组的参数传递问题,分析了静态数组、动态数组和STL容器三种实现方式。首先,文章解析了二维数组的内存模型和类型系统特性,指出其在内存中的连续存储方式和类型信息的维度数据。接着,详细介绍了静态二维数组的固定列数传参和模板确定尺寸的方法,以及动态二维数组的指针数组方案和单块连续内存方案。此外,文章还讨论了STL容器方案,包括vector嵌套容器和单vector模拟二维数组的方法。最后,文章分析了性能关键因素,指出了常见陷阱并提供了解决方案,建议根据实际需求选择合适的设计模式。

2501_91516851的博客 741

Frida实战:SSL Pinning绕过技术全解析

本文详细解析了如何使用Frida工具绕过SSL Pinning技术,包括环境搭建、四种实战绕过方案及常见问题排查指南。通过具体代码示例和实战经验,帮助安全研究人员快速掌握SSL Pinning绕过技术,适用于金融类App的安全测试场景。

weixin_42530732的博客 187

车企常用架构、通信设计、需求管理工具全汇总

车辆技术是个系统工程,比较大,需要多人协作。“协作”往往需要工具参与,才能保证协作过程的高效、有条不紊。 【文章系转载,出处见图片水印】 今天我们就来捋一捋汽车行业常用的架构、网络开发工具~ Preevision 大名鼎鼎的Preevision,来自大名鼎鼎的Vector。 个人觉得,它是Vector公司最牛逼、最神秘、最高高在上的产品,犹如空谷回响、千里传音,但是很少看到它真正落地。 它最引以为傲的,或许是在给客户做介绍的时候,说“我们甚至能够精确到每一根线束的长度”,但是反观.

MaveDiao的博客 3483

【转】c/c++:二维数组作为参数传递

链接:http://blog.youkuaiyun.com/xuleicsu/article/details/919801 more info:http://guoyiqi.iteye.com/blog/1626922 http://www.wutianqi.com/?p=1822 http://www.cnblogs.com/bigshow/archive/2009/01/03/1367661.htm...

weixin_34186950的博客 83

【Isaac Sim】无头服务器远程桌面连接实战:Turbovnc配置与常见问题解决

本文详细介绍了在无头GPU服务器上通过Turbovnc远程桌面连接并运行NVIDIA Isaac Sim的实战教程。针对无图形界面服务器运行仿真软件的核心痛点,文章提供了从Turbovnc安装配置、SSH隧道建立,到以普通用户身份启动服务、解决GLXBadFBConfig等常见图形错误的完整方案,帮助开发者在云端高效部署机器人仿真环境。

weixin_29254673的博客 772

C++ 二维数组参数传递 2 种安全方案:引用模板与指针的编译期检查

本文深入探讨了C++中二维数组参数传递的两种安全方案:基于模板化引用的编译期检查方案和基于指针的动态内存管理方案。通过详细代码示例和对比分析,帮助开发者解决数组维度信息丢失、内存管理等核心挑战,提升代码安全性和运行效率。特别适合需要严格类型安全或运行时灵活性的C++项目。

weixin_30875157的博客 2387

告别传统RAG的痛点!Agent Skills让知识库检索更智能(本地知识库搭建新思路:用Agent Skills实现渐进式检索)

传统RAG在知识库检索中存在文档结构丢失、Token消耗大等问题 📚 Agent Skills通过分层索引、渐进式检索等设计,实现了更智能的本地知识库检索方案 🤖 本文详细介绍了Agent Skills的核心设计理念、与传统RAG的对比以及实践建议,帮助你搭建高效的知识库系统 ✅

XiaoqiangClub的博客 692

《Python入门到精通》函数详解

函数就是一段「封装」起来的「代码」,目的是提高代码的「模块性」和「复用性」。 2、函数的参数 2.1、变量的就近原则 2.2、传递参数 2.3、形参和实参 2.4、位置参数 2.5、缺省参数 2.6、可变类型和不可变类型 2.7、关键字参数 3、匿名函数 4、函数的返回值

wangyuxiang946的博客 1万+

C++常见问题:二维数组作为参数传递和使用

这里的 arr 实际上是一个数组指针(即 & 数组名),arr 首先和 * 结合,因此 arr 首先是一个指针类型变量,然后这个指针类型变量指向的是一个由四个 int 类型变量组成的数组,即一维数组指针,而非指向一维数组首地址的数组名。*(arr + r)则即解引用行指针,即表示的是第 R 行(一个数组由四个 int 类型变量组成),同时也表示指向这个由四个int类型组成数组的第一个元素的地址。arr + r 则是指向二维数组的第 R 行数组指针,这一行同样是四个 int 类型组成的数组。

ifuturer的博客 347

025、空间降噪与时域降噪:噪声抑制与细节保留的平衡艺术

《降噪技术的平衡艺术:空间与时域降噪的协同优化》 本文深入探讨了图像处理中空间降噪与时域降噪的技术原理与工程实践。空间降噪通过像素级处理提升单帧质量,而时域降噪则利用帧间信息增强稳定性。文章揭示了两种方法在实际应用中的矛盾点:过度降噪会导致细节损失,影响后续算法性能。作者结合车载环视系统等实战案例,详细分享了参数调优经验,包括运动自适应策略、边缘保持技巧和嵌入式平台优化方案。特别强调降噪的最终目标应服务于下游算法需求,而非单纯追求图像美观。文章为工程人员提供了从理论到实践的完整指导,展现了降噪技术在效果与性

sundong_81的博客 186

C++ 二维数组参数传递 2 种引用写法详解:模板与固定大小的编译期检查

本文深入解析C++中二维数组参数传递的两种引用写法:固定大小引用和模板化引用,通过编译期检查确保类型安全。详细对比传统指针传递的优缺点,展示如何利用现代C++特性避免内存越界等常见问题,提升代码安全性和性能。特别适合需要处理多维数组的C++开发者。

weixin_34245749的博客 333

Unity-RetargetPro3-动画插件试用

一个名气大于实战的插件。

大话程序员 710

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

二维数组传参C++实现

方法函数参数写法是否需要额外传维度优点静态数组是,必须传行数语法简单,性能高否更安全、更灵活、更符合现代C++风格对于这种情况,方法一完全够用。但如果你想写出更灵活、更健壮的C++代码,强烈建议习惯使用vector的方式。

2401_87272213的博客 765

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

二维数组作为参数传递给函数的一些方法

因为自己做算法题的时候遇到过,最开始的时候比较苦恼,查到的方法又比较乱,这里总结了三种方法,并分别给出了函数声明的写法,即形参的写法,和传递实参时的写法。显示传递一个二维数组,但是第二维必须固定。第一维可以不写,可以固定,可以比原数组小,会截断。将实参的数组名强转为int*型,这样传递的就相当于一维数组名,函数形参要进一步传入行列的大小,以手工寻址将实参的数组名强转为int**型,那么函数形参可以...

Mercury_yz的博客 2196

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

背景 int a[2][2]={ {4, 6}, {9, 11} }; 我定义了这样一个数组,我想把这个数组作为参数,传递到一个函数中,并要在函数中能引用该二维数组的元素,我该怎么做? 第一种方式是直接传递二维数组,但是必须标明第二维的值,因为如果只是传递a[][],编译器无法分配这样的数组,所以要这样传int a[][3] 第二种方法是传递指针数组方式,即int (*a)[3] 第三种是传递指针方法。 代码实现 方法1:传递数组,注意第二维必须标明 //二维数组传参问题示例 #incl.

ancy的博客 6489

二维数组作为参数传递问题

本文转载自:http://blog.youkuaiyun.com/liuzhanchen1987/article/details/7712640 int a[2][2]={ {4, 6}, {9, 11} }; 我定义了这样一个数组,我想把这个数组作为参数,传递到一个函数中,并要在函数中能引用该二维数组的元素,我该怎么做?   第一种方式是直接传递二维数组,但是必须标明第二维的值,

vgxpm的专栏 747

《C++ 中用 std::vector 打造动态增长二维数组:技巧与应用全解》

要使用 std::vector 创建动态增长的二维数组,我们可以把二维数组看作是一个包含多个 std::vector 的 std::vector。也就是说,外层的 std::vector 的每个元素都是一个内层的 std::vector ,代表二维数组的一行。通过深入理解 std::vector 的特性和合理运用相关的编程技巧,我们可以更好地应对各种复杂的编程场景,开发出更高效、更灵活的程序。

xy520521的博客 758

linux下二维数组怎么传参,C/C++语言二维数组的传参方法总结

C/C++语言将二维数组作为参数传递容易使人迷惑且易出错,本文将常用的几种方法列出,以方便用时查阅。三种方法总结如下(GCC验证成功):方法一:形参为二维数组并给定第二维长度此方法是最简单最直观的方法,形参与实参一样,容易理解。举例:#include void subfun(int n, char subargs[][5]){int i;for (i = 0; i < n; i++) {pr...

weixin_32941303的博客 640
上一篇: C++:inline
下一篇: 递归问题套路
Netfishless
博客等级 码龄9年 3640粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值