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

先放结论:

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.rhkb.cn/news/338614.html

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

相关文章

Kafka 集群 KRaft 模式搭建

一、Kafka 集群 KRaft 介绍 Kafka的KRaft模式是一种新的元数据管理方式&#xff0c;旨在去除对ZooKeeper的依赖&#xff0c;使Kafka成为一个完全自包含的系统。在Kafka的传统模式下&#xff0c;元数据管理依赖于ZooKeeper&#xff0c;这增加了部署和运维的复杂性。为了解决这个…

MySQL—函数(介绍)—字符串函数(基础)

一、引言 提到函数&#xff0c;在SQL分类中DQL语句中有一个聚合函数&#xff0c;如COUNT()、SUM()、MAX()等等。这些都是一些常见的聚合函数&#xff0c;而聚合函数只是函数的一种&#xff0c;接下来会详细的学习和介绍一下函数的应用场景和以及 mysql 当中文件的函数有哪些。 …

大学生Python自救课程总结

因为一些事情的缘故&#xff0c;我已经几乎没有更新很久了&#xff0c;然后现在快到期末了&#xff0c;不知道各位学习python的同志们慌不慌【坏笑】。 本学期&#xff0c;我只是简单的讲了讲python的基础用法。当然&#xff0c;可能有些地方总结的并不全面&#xff0c;很多知…

.gitignore 文件

一.什么是 .gitignore 文件 在任何当前工作的 Git 仓库中&#xff0c;每个文件都是这样的&#xff1a; 追踪的&#xff08;tracked&#xff09;- 这些是 Git 所知道的所有文件或目录。这些是新添加&#xff08;用 git add 添加&#xff09;和提交&#xff08;用 git commit 提…

allure测试报告用例数和 pytest执行用例数不相同问题

我出现的奇怪问题&#xff1a; pytest执行了9条用例&#xff0c;但是测试报告确只显示3条用例 我将其中的一个代码删除后&#xff0c;发现allure测试报告又正常了 我觉得很奇怪这个代码只是删除了二维数组的第一列&#xff0c;我检查了半天都找不到问题&#xff0c;只有降低版本…

【自撰写,国际象棋入门】第1课、棋盘和棋子

第1课 棋盘和棋子 一、国际象棋的棋盘 国际象棋的棋盘为一8乘8的黑、白格相间的棋盘&#xff0c;8条竖线的编号分别为A-H&#xff0c;8条横线的编号分别为1-8&#xff0c;在记谱时用竖线编号横线编号的方式表示棋盘上的格子&#xff0c;例如a1格、h8格等.棋盘上有几条重要的大…

【数据密集型系统设计】软件系统的可靠性、可伸缩性、可维护性

文章目录 一. 数据密集型程序的特点以及遇到的问题二. 可靠性 : 即使出现问题&#xff0c;也能继续正确工作1 硬件故障2. 软件错误3. 人为错误 二. 可伸缩性1. 描述负载与推特的例子2. 描述性能-延迟和响应时间3. 应对负载的方法 四. 可维护性1. 可操作性&#xff1a;人生苦短&…

汇编:调用Win32 API

在32位汇编程序中使用 Win32 API 是很常见的&#xff0c;特别是在开发 Windows 应用程序时调用的频率很高&#xff0c;Win32 API 提供了访问 Windows 操作系统功能的接口&#xff0c;包括窗口、消息处理、文件操作、网络通信等等。以下是使用 Win32 API 的一般步骤&#xff1a;…

数据结构与算法03-散列表(哈希表)

介绍 散列表&#xff08;Hash table&#xff0c;也叫哈希表&#xff09;&#xff0c;是根据键&#xff08;Key&#xff09;而直接访问在存储器存储位置的数据结构。也就是说&#xff0c;它通过计算出一个键值的函数&#xff0c;将所需查询的数据映射到表中一个位置来让人访问&…

队列——一种操作受限的线性表

队列 队列&#xff08;Queue&#xff09;简称队&#xff0c;也是一种操作受限的线性表&#xff0c;只允许在表的一端进行插入&#xff0c;而在表的另一端进行删除。向队列中插入元素称为入队或进队&#xff0c;删除元素称为出队或离队。队列中的元素是先进先出&#xff08;Fir…

win_os_linux不能用于文件名的保留字符

windows 在 Windows 文件系统中&#xff0c;以下字符是保留字符&#xff0c;不能用于文件名或目录名&#xff1a; < (小于号)> (大于号): (冒号)" (双引号)/ (斜杠)\ (反斜杠)| (竖线)? (问号)* (星号) 此外&#xff0c;文件名不能以空格或句点 (.) 结尾&#x…

关于Golang中自定义包的简单使用-Go Mod

1. go env 查看 GO111MODULE 是否为 on&#xff0c;不是修改成on go env -w GO111MODULEon 2 .自定义包的目录格式 3. test.go 内容 package calc func Add(x, y int) int { // 首字母大写表示公有方法return x y }func Sub(x, y int) int {return x - y } 4.生成calc目…

动规算法-地下城游戏

在刷题练习专栏中&#xff0c;已经写了两篇文章实现对动态规划入门题目的讲解了&#xff0c;动态规划这类题目很难很好的掌握&#xff0c;今天给大家带来稍微深入的题目&#xff0c;帮助大家更好的理解动态规划的算法思想&#xff0c;加深对该算法的理解&#xff0c;建议看每道…

高考试卷押运车视频监控解决方案

一、引言 高考作为我国教育领域的重要事件&#xff0c;其公正、公平和安全性一直备受社会关注。试卷押运作为高考的重要环节&#xff0c;其安全性直接关系到高考的顺利进行和考生的切身利益。因此&#xff0c;对高考试卷押运车实施视频监控解决方案&#xff0c;对于确保试卷安…

使用eclipse自动生成实体类

前言 在软件开发过程中&#xff0c;经常需要创建大量的实体类来映射数据库表或者表示业务模型。手动编写实体类既费时又容易出错&#xff0c;因此许多集成开发环境&#xff08;IDE&#xff09;提供了自动生成实体类的功能。本篇博客将介绍如何在 Eclipse 中内置功能来快速生成实…

mybatis异常:Invalid bound statement (not found): com.lm.mapper.ArticleMapper.list

现象&#xff1a; 原因&#xff1a; 无效绑定&#xff0c;应该是mybatis最常见的一个异常了&#xff0c;接口与XML文件没绑定。首先&#xff0c;mapper接口并没有实现类&#xff0c;所以框架会通过JDK动态代理代理模式获取接口的代理实现类&#xff0c;进而根据接口全限定类名…

嵌入式期末复习

一、选择题&#xff08;20&#xff09; 二、判断题&#xff08;10&#xff09; 三、填空题&#xff08;10&#xff09; 主机-目标机的文件传输方式主要有串口传输方式、网络传输方式、USB接口传输方式、JTAG接口传输方式、移动存储设备方式。常用的远程调试技术主要有 插桩/st…

CentOS7 部署单机版 ElasticSearch + Logstash + Kibana

一、部署ElasticSearh 参考下面文章&#xff1a; CentOS7 部署单机版 ElasticSearch Logstash-CSDN博客文章浏览阅读83次&#xff0c;点赞2次&#xff0c;收藏2次。通过logstash收集信息&#xff0c;发送给elasticsearch处理。https://blog.csdn.net/weixin_44295677/articl…

simCSE句子向量表示(1)-使用transformers API

SimCSE SimCSE: Simple Contrastive Learning of Sentence Embeddings. Gao, T., Yao, X., & Chen, D. (2021). SimCSE: Simple Contrastive Learning of Sentence Embeddings. arXiv preprint arXiv:2104.08821. 1、huggingface官网下载模型 官网手动下载&#xff1a;pri…

2024年03月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 以下选项中,创建类正确的是?() A: class test1:def prt(self):……B: class Mg(