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

news2025/1/21 5:00:45

先放结论:

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.coloradmin.cn/o/1719388.html

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

相关文章

高并发项目-分布式Session解决方案

分布式Session解决方案 1.保存Session&#xff0c;进入商品列表页面 1.保存Session 1.编写工具类 1.MD5Util.java package com.sxs.seckill.utils;import org.apache.commons.codec.digest.DigestUtils;/*** Description: MD5加密工具类** Author sun* Create 2024/5/5 14…

uni-app实现页面通信EventChannel

uni-app实现页面通信EventChannel 之前使用了EventBus的方法实现不同页面组件之间的一个通信&#xff0c;在uni-app中&#xff0c;我们也可以使用uni-app API —— uni.navigateTo来实现页面间的通信。注&#xff1a;2.8.9 支持页面间事件通信通道。 1. 向被打开页面传送数据…

【Linux】操作系统之冯诺依曼体系

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; Linux &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解 操作系统中 冯诺依曼体系 的相关内容。 如果看到最后您觉得这篇文…

File(文件)

File对象表示一个路径&#xff0c;可以是文件的路径&#xff0c;也可以是文件夹的路径。 这个路径可以存在&#xff0c;也允许不存在。 创建File对象的方法 public class test {public static void main(String [] args) {//根据字符串创建文件String str"C:\\Users\\PC…

每日一题——力扣141. 环形链表(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 专业点评 时间复杂度分析 空间复杂度分析 总结 我要更强 方法2&#x…

cdo | 常用命令

整理一下平时经常会使用的cdo命令 如何来更改netcdf数据中的变量名呢&#xff1f; 假设我现在有一个sst月平均数据,希望将里面的变量名称sst修改为sst_new netcdf oisst_monthly { dimensions:lat 180 ;lon 360 ;time UNLIMITED ; // (476 currently)nbnds 2 ; variable…

V90 PN总线伺服通过FB285速度控制实现正弦位置轨迹运动(解析法和数值法对比测试)

V90总线伺服相关内容请参考专栏系列文章,这里不在详述 1、V90伺服PN总线速度随动控制 V90伺服PN总线速度随动控制(手摇轮功能)_手摇轮可以接总线plc吗?-CSDN博客文章浏览阅读632次。V90PN总线控制相关内容,请参考下面文章链接:博途1200/1500PLC V90 PN通信控制 (FB284功能…

【html】用html模拟微信布局

您做的这个模拟微信布局的作品很不错,使用了Flexbox布局来实现元素的灵活排列。以下是关于您代码的一些分析和建议: 效果图: 代码分析: 全局样式重置: 您使用了* { margin: 0; padding: 0; }来重置所有元素的边距。这是一个常见的做法,可以避免不同浏览器默认样式的差…

ARM32开发——LED点灯

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 点灯的两种方式灌入电流法输出电流法扩展板点灯点灯方式点亮LED1-4完整实现 点灯的两种方式 不同颜色LED&#xff0c;达到相同亮度…

LLM Agent提效揭秘4:多智能体协作工作流深度剖析

在此之前&#xff0c;我们已经从论文到代码深度解读了吴恩达&#xff1a;GPT-4Agents Workflow&#xff0c;性能比肩GPT-5的三种大语言模型Agent工作流&#xff1a;反思、工具使用和规划。今天我们将深入最后一种Agent工作流&#xff1a;多智能体协作工作流。 想象一个未来&am…

3.spring源码:refresh()第一个方法prepareRefresh()

重点: 1.了解prepareRefresh()方法的作用:就是为容器刷新做了准备工作 2.整体了解refresh()方法 synchronized加锁的原因:刷新和销毁( "refresh" and "destroy" 都是一个完整的过程,需要加锁 改方法进入可以看到是空的,是为了扩展用的 该方法我们可以自己重…

visual studio code 全局搜索

VScode写代码的时候&#xff0c;会经常性的需要进行查找代码&#xff0c;那么怎么在Visual Studio Code中进行查找呢&#xff0c;下面就来大家vscode全局搜索的方法。 想要在vscode全局搜索进行全局搜索&#xff0c;使用快捷键CTRLSHIFTF即可进行搜索&#xff0c;也可以在左边…

GSM信令流程(附着、去附着、PDP激活、修改流程)

1、联合附着流程 附着包括身份认证、鉴权等 2、去附着流程 用户发起去附着 SGSN发起去附着 HLR发起去附着 GSSN使用S4发起去附着 3、Activation Procedures(PDP激活流程) 4、PDP更新或修改流程 5、Deactivate PDP Context 6、RAU(Routeing Area Update)流程 7、鉴权加…

NATS-研究学习

NATS-研究学习 文章目录 NATS-研究学习[toc]介绍说明提供的服务内容各模式介绍测试使用发布订阅&#xff08;Publish Subscribe&#xff09;请求响应&#xff08;Request Reply&#xff09;队列订阅&分享工作&#xff08;Queue Subscribers & Sharing Work&#xff09;…

vue+vant移动端显示table表格加横向滚动条

vant移动端显示table效果&#xff0c;增加复选框&#xff0c;可以进行多选和全选。加横向滚动条&#xff0c;可以看全部内容。 <template><div class"app-container"><div class"nav_text" style"position: relative;"><…

简单介绍QKeySequenceEdit的使用

QKeySequenceEdit是Qt框架中的一个便捷用户界面组件&#xff0c;用于输入和显示键盘快捷键。它提供了一个简单的界面&#xff0c;允许用户输入一个键盘快捷键&#xff0c;并将其显示为一个字符串。这在需要配置快捷键的应用程序中非常有用。在本文中&#xff0c;我们将详细介绍…

【C++】——string模拟实现

前言 string的模拟实现其实就是增删改查&#xff0c;只不过加入了类的概念。 为了防止与std里面的string冲突&#xff0c;所以这里统一用String。 目录 前言 一 初始化和销毁 1.1 构造函数 1.2 析构函数 二 迭代器实现 三 容量大小及操作 四 运算符重载 4.1 bool…

二叉树的顺序实现-堆

一、什么是堆 在数据结构中&#xff0c;堆&#xff08;Heap&#xff09;是一种特殊的树形数据结构&#xff0c;用数组存储&#xff0c;通常被用来实现优先队列。 堆具有以下特点&#xff1a; 堆是一棵完全二叉树&#xff08;Complete Binary Tree&#xff09;&#xff0c;即…

uni-app的网络请求库封装及使用(同时支持微信小程序)

其实uni-app中内置的uni.request()已经很强大了&#xff0c;简单且好用。为了让其更好用&#xff0c;同时支持拦截器&#xff0c;支持Promise 写法&#xff0c;特对其进行封装。同时支持H5和小程序环境&#xff0c;更好用啦。文中给出使用示例&#xff0c;可以看到使用变得如此…

算法(六)计数排序

文章目录 计数排序技术排序简介算法实现 计数排序 技术排序简介 计数排序是利用数组下标来确定元素的正确位置的。 假定数组有10个整数&#xff0c;取值范围是0~10&#xff0c;可以根据这有限的范围&#xff0c;建立一个长度为11的数组。数组下标从0到10&#xff0c;元素初始…