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

先放结论:

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。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

unity2D跑酷游戏

项目成果 项目网盘 导入资源包 放入Assets文件Assets资源文件 游戏流程分析 摄像机size调小&#xff0c;让图片占满屏幕 人跑本质&#xff0c;相对运动&#xff0c;图片无限向右滚动 图片720&#xff0c;缩小100倍第二个图片x为7.2每unit px100两张图片刚好挨着连贯 空对象Bg…

Cloudflare的增长正在放缓,股价过高,未来将进一步下跌

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 一、Cloudflare公司介绍 1.1、Cloudflare(NET)是一家全球性云平台&#xff0c;总部位于美国旧金山&#xff0c;在英国伦敦亦设有办事处。 Cloudflare以向客户提供网站安全管理、性能优化及相关的技术支持为主要业务。通过基…

职场中,那些35岁以上的测试猿到底去哪了?

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

收银系统源码--商超水果生鲜店收银硬件要怎么选择?

新零售时代&#xff0c;越来越多的商家开始明白&#xff0c;除了要做好店铺定位、店面装潢和商品的设定&#xff0c;还要选购最适合店铺运营需求的收银机和硬件&#xff0c;好的收银机和收银系统可以帮助商家做好收支统计、库存管理、人员配置。客户服务等工作。现在的智能收银…

解决bind error: Address already in use

是端口复用问题 产生原因 程序突然退出系统但是没有释放端口 问题解决 首先通过 //显示进程信息 ps -la //杀死相关进程 kill -9 xxxx然后添加socket设置 int on1; if(setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))<0){perror("setsockopt")…

RocketMQ学习(2) 深入学习

RokcetMQ的介绍和基础知识见这篇博客——RocketMQ学习(1) 快速入门 本篇为上一篇的深入学习&#xff0c;很多基础知识不再赘述。 目录 消息重复消费问题(去重;幂等)布隆过滤器 重试机制死信消息 SpringBoot集成RocketMQ集成SpringBoot发送不同消息模式(同步消息)异步消息单向消…

Kafka系列之高频面试题

基础 简介 特点&#xff1a; 高吞吐、低延迟&#xff1a;kafka每秒可以处理几十万条消息&#xff0c;延迟最低只有几毫秒&#xff0c;每个Topic可以分多个Partition&#xff0c;Consumer Group对Partition进行Consumer操作可扩展性&#xff1a;Kafka集群支持热扩展持久性、可…

OFA one-for-all 通用多模态预训练模型

使用简单的序列到序列的学习框架 统一模态 &#xff08;跨模态、视觉、语言等模态&#xff09;和任务&#xff08;如图片生成、视觉定位、图片描述、图片分类、文本生成等&#xff09; ICML 2022&#xff1a; 《OFA: Unifying Architectures, Tasks, and Modalities Through a…

2024最新 Jenkins + Docker 实战教程(六)- Jenkins配置邮箱接收构建通知

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

Redis常用命令大全

目录 1、五大数据类型的基本命令 1.1 字符串 1.2 列表 1.3 哈希 1.4 集合 1.5 有序集合 2、与key相关 2.1 查看redis数据的类型 2.2 查看当前redis库中的所有key命令 3、除了五大数据类型外常见命令 3.1 键操作 3.2 服务器操作 3.3 连接操作 3.4 发布/订阅 3.5 事…

vue canvas绘制信令图二、

需求:根据信令图标题的每2个区域之间有无内容来给宽度,无内容区域的间隔要小一些。有内容区域的间隔大一些。 先上效果图: 从上面的效果图可以看出无内容区域的间隔宽度变小了很多。 1、先设置一个最先间隔的宽度:minGapX: 200, 2、然后设置一个 存放有计算后的间隔数据:…

【爱空间_登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

尝试用智谱机器人+知识库,制作pytorch测试用例生成器

尝试用智谱机器人知识库,制作pytorch测试用例生成器 1 保存pytorch算子文档到txt2 创建知识库3 创建聊天机器人4 测试效果5 分享 背景:是否能将API的接口文档和sample放到RAG知识库,让LLM编写API相关的程序呢 小结:当前的实验效果并不理想,可以生成代码,但几乎都存在BUG 1 保存…

SpringCloud Feign用法

1.在目标应用的启动类上添加开启远程fein调用注解&#xff1a; 2.添加一个feign调用的interface FeignClient("gulimall-coupon") public interface CouponFeignService {PostMapping("/coupon/spubounds/save")R save(RequestBody SpuBondTo spuBounds);…

数据结构的快速排序(c语言版)

一.快速排序的概念 1.快排的基本概念 快速排序是一种常用的排序算法,它是基于分治策略的一种高效排序算法。它的基本思想如下: 从数列中挑出一个元素作为基准(pivot)。将所有小于基准值的元素放在基准前面,所有大于基准值的元素放在基准后面。这个过程称为分区(partition)操作…

期末速成 ——计算机组成原理(2)数值的表示与运算

目录 一、定点数的表示 &#xff08;一&#xff09;无符号数和有符号数的表示 &#xff08;二&#xff09;机器数的定点表示 &#xff08;三&#xff09;原码、补码、反码、移码 (1)原码表示法 二、浮点数的表示 三、溢出判断 (一)采用一位符号位 (二)采用双符号位 四…

重学java 53. 集合 二叉树查找树红黑树

少焦虑 多睡觉 常开心 —— 24.5.30 二叉树&#xff1a; 分支不能超过两个 平衡树&#xff1a; 左孩子和右孩子数量相等 不平衡树&#xff1a; 左孩子数量不等于右孩子 排序树/查找树: 在二又树的基础上元素是有大小排序的 左子树小,右子树大 红黑树&#xff1a; 1.每一个节点…

conda与pip的镜像源与代理设置

conda与pip的镜像源与代理设置 一、前言二、conda镜像源设置2.1conda默认镜像源介绍2.2通过终端设置镜像源2.3通过配置文件设置镜像源 三、pip镜像源设置3.1pip默认镜像源介绍3.2通过终端临时设置镜像源3.3通过配置文件设置一个或多个镜像源 四、conda代理设置4.1通过终端设置代…

SpringBoot 基于jedis实现Codis高可用访问

codis与redis的关系 codis与redis之间关系就是codis是基于多个redis实例做了一层路由层来进行数据的路由&#xff0c;每个redis实例承担一定的数据分片。 codis作为开源产品&#xff0c;可以很直观的展示出codis运维成本低&#xff0c;扩容平滑最核心的优势. 其中&#xff0…

一键安装 HaloDB 之 Ansible for Halo

↑ 关注“少安事务所”公众号&#xff0c;欢迎⭐收藏&#xff0c;不错过精彩内容~ 前倾回顾 前面介绍了“光环”数据库的基本情况和安装办法。 哈喽&#xff0c;国产数据库&#xff01;Halo DB! 三步走&#xff0c;Halo DB 安装指引 以及 HaloDB 的 Oracle 和 MySQL 兼容模式: …