二维数组传参时不用二级指针接收

先放结论:

1.   二维数组数组名指向的类型是 int [x] 类型,int** 指针指向类型是 int* ,如果用二级指针接收会导致访问错误,因为 int [x] 类型和 int* 类型不同。
2.   指向什么类型的指针+1就按照该类型的字节数+1移动。

        最近在学图的创建,关于二维数组传参的部分有了很大混淆,因i为二级指针也可以用来模拟二维数组。当然不知道图的创建也没问题,下面先来看代码:

        在下面的代码中,G->vexsNum等于6,arcs是一个二级指针,它开辟了6个int*的内存用于存放一级指针,然后每个一级指针也就是for循环中的G->arcs[i]又开辟了6个int的内存用于存放int整形,最后的结果可以看成是创建了一个 6*6 的 int 正方形。

    G->arcs = (int**)malloc(sizeof(int*)*G->vexsNum);for (int i = 0; i < VexsNum; i++) {G->arcs[i] = (int*)malloc(sizeof(int)*G->vexsNum);}

        这是我们创建的二维数组,当我们有一个外部的二维数组要给 arcs[i] [j] 里的每个成员赋值的时候我们应该如何传参呢?

先来看第一段代码,因为我们刚才创建二维数组时使用的是二级指针,现在用二级指针来接收二维数组好像没有什么问题,但是一调试就会报错出现问题,这是怎么回事?

	int array[6][6] = {0,6,1,5,1,2,6,0,5,4.3,2,1,5,0,5,6,4,5,3,5,0,0,2,2,3,6,1,0,6,};MyGraphCreat(G, array);//main函数中的调用void MyGraphCreat( Graph* G, int** data) {for (int a = 0; a < G->vexsNum; a++) {for (int b = 0; b < G->vexsNum; b++) {G->arcs[a][b] = data[a][b];}}
}

 

        仔细回想一下 data[a][b]的含义,data[a][b] 就是*(*(data+a)+b),data是 int** 指针代表指向类型是 int* 类型,+a就是跳过 a 个int* 类型,再+b跳过b个int类型,找到数。

        但是咱们的二维数组的数组名是什么,是第一行的地址, 也就是说 array 是 array[0] 的地址,&array[0],也就是一维数组的指针,指向的是 int [6] 类型的数据。这时data[a][b]就是 *(data+a),就是data跳过a个 int [6] 类型的数据,解引用先找到一维数组 data[a],然后再*(*(data+a)+b),在一维数组中跳过b个int类型的数据,解引用找到最后的数。

        也就是说,int* 类型和 int [6] 类型不是一样的,所以不能这样传参,代码的错误就在于指针类型的改变。本来 int** 和二维数组都可以各自 G->arcs[a][b], data[a][b],都可以这样访问,int** 类型指针+1是跳过一个int*,二维数组+1是跳过一个int [6] 数组,这时你把二维数组强行变为 int** 类型来传参,二维数组中没有跳过一个 int* 的操作,就导致错误了。

所以如何传参呢,下面就是一个最帮助理解的例子:

void MyGraphCreat( Graph* G, int(*data)[6]) {for (int a = 0; a < G->vexsNum; a++) {for (int b = 0; b < G->vexsNum; b++) {G->arcs[a][b] = data[a][b];}}
}

        传过来的是指向 int [6] 类型的指针,所以就用一个数组指针来接收,一次跳过一个 int [6] 类型找到数组,再 [b] 找到数。

或者也可以直接这样传参:

void MyGraphCreat( Graph* G, int data[6][6]) {for (int a = 0; a < G->vexsNum; a++) {for (int b = 0; b < G->vexsNum; b++) {G->arcs[a][b] = data[a][b];}}
}

        这样就直接可以看出来传的是一个二维数组。

但是如果不是 6*6 的数组呢?我们要更改 6,这样比较麻烦,直接用一级指针(int*)来接收二维数组,这样,每次指针+1就会只跳过1个int类型。代码如下:

void MyGraphCreat( Graph* G, int* data {for (int a = 0; a < G->vexsNum; a++) {for (int b = 0; b < G->vexsNum; b++) {G->arcs[a][b] = *(data+a*G->vexsNum+b);}}
}
a

        因为二维数组的存储是连续的,如果想找array[6][6]中,第2行第4个元素 (array[1][3]) ,相当于第10个数,只需要让指针+1*6+3,此时a是1,b是3,也就是+9。

这就是文章的全部内容了,感谢阅读,希望对你有所帮助,如有错误欢迎评论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/19852.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初识java——javaSE(8)异常

文章目录 一 异常的概念与体系结构1.1 什么是异常&#xff1f;1.2 异常的体系结构&#xff01;1.3 编译时异常与运行时异常与Error编译时异常&#xff1a;异常声明&#xff1a;throws关键字 运行时异常&#xff1a;什么是Error? 二 处理异常2.1 异常的抛出&#xff1a;throw(注…

5.23R语言-参数假设检验

理论 方差分析&#xff08;ANOVA, Analysis of Variance&#xff09;是统计学中用来比较多个样本均值之间差异的一种方法。它通过将总变异分解为不同来源的变异来检测因子对响应变量的影响。方差分析广泛应用于实验设计、质量控制、医学研究等领域。 方差分析的基本模型 方差…

重庆人文科技学院建立“软件安全产学研基地”,推动西南地区软件安全发展

5月29日&#xff0c;重庆人文科技学院与开源网安签订了《产学研校企合作协议》&#xff0c;并举行了“重庆人文科技学院产学研基地”授牌仪式&#xff0c;此次合作不仅深化了双方在软件安全领域的产学研紧密联结&#xff0c;更是对川渝乃至西南地区软件供应链安全发展起到重要的…

AI免费插件 批量条码大师,支持100多种条码类型

没想到在网上看到一款和之前 悟空条码 类似的条码插件&#xff0c;叫批量条码大师&#xff0c;他做的比 悟空条码 功能更强&#xff0c;界面更美观&#xff0c;特分享出来给大家。 本插件采用了BWIPJS条码库&#xff0c;支持110种条码、二维码的生成; 支持批量生成&#xff0c;…

爱堡集团数智掘金—共绘上市蓝图

&#xff08;本台记者报&#xff09;2024年5月26日爱堡集团在浙江省杭州市上城区瑞莱克斯大酒店隆重召开规模达500人的盛会。这场聚焦智慧与创新的会议&#xff0c;旨在加速爱堡集团的数智化转型进程&#xff0c;并为其上市之路绘制蓝图&#xff0c;吸引了众多行业领袖和媒体的…

Qt 插件机制使用及原理

目录 1.引言 2.插件原理 3.插件实现 3.1.定义一个接口集(只有纯虚函数的类) 3.2.实现接口 4.插件的加载 4.1.静态插件 4.1.1.静态插件实现方式 4.1.2.静态插件加载的过程 4.1.3.示例 4.2.动态插件 4.2.1.动态插件的加载过程 5.定位插件 6.插件开发的优势 7.总结…

GPT-4o有点坑

GPT-4o有点坑 0. 前言1. GPT-4o简介2. GPT-4o带来的好处2.1 可以上传图片和文件2.2 更丰富的功能以及插件 3. "坑"的地方3.1 使用时间短3.2 GPT-4o变懒了 4. 总结 0. 前言 原本不想对GPT-4o的内容来进行评论的&#xff0c;但是看了相关的评论一直在说&#xff1a;技…

Ai晚班车531

1.中央网信办等三部门&#xff1a;加快推进大模型、生成式人工智能标准研制。 2.中国石油与中国移动、华为、科大讯飞签署合作协议。 3.Opera浏览器与谷歌云合作&#xff0c;接入 Gemini 大模型。 4.谷歌 Gemini 加持Chromebook Plus。 5.英飞凌&#xff1a;开发 8kW和12kW…

改进YOLOv8系列:构建新型单头transformer模块,加入到骨干尾部

改进YOLOv8系列:构建新型单头transformer模块,加入到骨干尾部 需要修改的代码self attention代码创建yaml文件测试是否创建成功本文提供了改进 YOLOv8注意力系列包含不同的注意力机制以及多种加入方式,在本文中具有完整的代码和包含多种更有效加入YOLOv8中的yaml结构,读者…

【论文导读】Grid Graph Reduction for Efficient Shortest Pathfinding(2023 Access)

Grid Graph Reduction for Efficient Shortest Pathfinding 作者&#xff1a;CHAN-YOUNG KIM AND SANGHOON SULL 文章提出了一种“基于模式识别的网格阻塞”&#xff08; Pattern-Based Blocking on grid graphs&#xff0c;PBGG&#xff09;的预处理方法&#xff0c;以加快最…

数据分析案例-在线食品订单数据可视化分析与建模分类

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

[羊城杯 2021]BabySmc

运行就是输入flag 不知道怎么跳过去的 这个应该就是smc加密的函数了 运行完这个函数才能继续往下 int __cdecl main(int argc, const char **argv, const char **envp) {__int64 v3; // rbx__int64 v4; // r12__int64 v5; // r13unsigned __int64 v6; // raxchar v7; // spcha…

企业如何进行快递运费对账?

在电子面单寄件取代手写纸质面单之后&#xff0c;加上月结寄件模式的推行&#xff0c;企业快递运费对账&#xff0c;成了行政的一个难题...... 早期的手写纸质面单寄件&#xff0c;企业行政或者财务相关人员&#xff0c;遵循寄前审批&#xff0c;寄后报销的原则进行对账。随着电…

FinalShell无法连接Linux

Linux使用Vmware会创建一个网络&#xff0c;让两个子网处于一个网关&#xff0c;这样就能在windows中连接Linux&#xff0c;只有在这种情况下才能FinalShell才能连接Linux

KT6368A双模蓝牙芯片上电到正常发送AT指令或指令复位需要多久

一、简介 KT6368A芯片上电到正常发送AT指令&#xff0c;或者开启蓝牙广播被搜索到&#xff0c;或者指令复位需要多久等等系列问题总结 详细描述 其实这些问题归结到一起&#xff0c;就还是一个问题&#xff0c;芯片上电需要多久的时间 在另外一份文档里面&#xff0c;是有描…

Java设计模式 _行为型模式_访问者模式

一、访问者模式 1、访问者模式 访问者模式&#xff08;Visitor Pattern&#xff09;是一种行为型模式。它允许在不修改已有类结构的情况下&#xff0c;向类中添加新的操作。访问者模式通过将操作封装在一个访问者对象中&#xff0c;使得可以在不改变各个元素类的前提下&#x…

RedisTemplate实战应用--队列等

一、RedisTemplate队列插入 1、从集合左边插入值 https://blog.csdn.net/weixin_43658899/article/details/121040307 leftPush(K key, V value) redisTemplate.opsForList().leftPush("leftdatakey","bbbb");2、从集合左边开始在v1值后边插入新值v2 le…

使用 Django 连接 MySQL 数据库

文章目录 步骤一&#xff1a;安装必要的库和驱动步骤二&#xff1a;配置数据库连接步骤三&#xff1a;执行数据库迁移步骤四&#xff1a;开始使用 MySQL 数据库创建一个模型迁移模型到数据库使用模型进行数据操作创建新记录&#xff1a;查询记录&#xff1a;更新记录&#xff1…

Mac安装第三方软件的命令安装方式

场景&#xff1a; 打开终端命令行&#xff0c;sudo xattr -rd com.apple.quarantine&#xff0c;注意最后quarantine 后面加一个空格&#xff01;然后打开Finder&#xff08;访达&#xff09;&#xff0c;点击左侧的 应用程序&#xff0c;找到相关应用&#xff0c;拖进终端qua…

(超实用)京东订单数据分析案例-维度下钻

1&#xff0c;数据介绍&#xff0c;字段了解 尽可能熟悉业务&#xff0c;多知道字段的含义&#xff0c;字段字段间的逻辑关系&#xff0c;后期数据分析思路才能更清晰&#xff0c;结果才能更准确 2&#xff0c;订单数据分析基本思路 维度下钻 3&#xff0c;代码实现全流程思路…