二維數組傳參時不用二級指針接收

先放結論:

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.pswp.cn/bicheng/19852.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19852.shtml
英文地址,請注明出處:http://en.pswp.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(注…

容器多機部署eureka及相關集群服務出現 Request execution failed with message: AuthScheme is null

預期部署方案&#xff1a;兩個eureka三個相關應用 注冊時應用出現&#xff1a;Request execution failed with message: Cannot invoke “Object.getClass()” because “authScheme” is null&#xff0c;一開始認為未正確傳遞eureka配置的賬戶密碼&#xff0c;例&#xff1a;…

5.23R語言-參數假設檢驗

理論 方差分析&#xff08;ANOVA, Analysis of Variance&#xff09;是統計學中用來比較多個樣本均值之間差異的一種方法。它通過將總變異分解為不同來源的變異來檢測因子對響應變量的影響。方差分析廣泛應用于實驗設計、質量控制、醫學研究等領域。 方差分析的基本模型 方差…

重慶人文科技學院建立“軟件安全產學研基地”,推動西南地區軟件安全發展

5月29日&#xff0c;重慶人文科技學院與開源網安簽訂了《產學研校企合作協議》&#xff0c;并舉行了“重慶人文科技學院產學研基地”授牌儀式&#xff0c;此次合作不僅深化了雙方在軟件安全領域的產學研緊密聯結&#xff0c;更是對川渝乃至西南地區軟件供應鏈安全發展起到重要的…

力扣linkedlist

反轉鏈表、 public class reverseList { // 1->2->3->o 、 o<-1<-2<-3public ListNode reverseList(ListNode head){//反轉鏈表ListNode prevnull;ListNode currhead;while(curr!null){ListNode nextcurr.next;curr.nextprev;prevcurr;currnext;}retu…

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…

速盾:cdn和udp的區別?

CDN&#xff08;Content Delivery Network&#xff09;和UDP&#xff08;User Datagram Protocol&#xff09;是網絡領域中常用的兩個術語&#xff0c;分別代表了不同的技術和功能。下面將分別介紹它們的區別。 功能和應用場景 CDN是一種分布式架構的網絡服務&#xff0c;通過在…

改進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;以加快最…

XML Web 服務技術解析:WSDL 與 SOAP 原理、應用案例一覽

XML Web服務是一種用于在網絡上發布、發現和使用應用程序組件的技術。它基于一系列標準和協議&#xff0c;如WSDL、SOAP、RDF和RSS。下面是一些相關的內容&#xff1a; WSDL&#xff08;Web服務描述語言&#xff09;&#xff1a;用于描述Web服務的基于XML的語言&#xff0c;定義…

安卓手機APP開發___廣播概述

安卓手機APP開發___廣播概述 目錄 概述 關于系統廣播 系統廣播所發生的更改 接收廣播 清單聲明的接收器 上下文注冊的接收器 對進程狀態的影響 發送廣播 通過權限限制廣播 帶權限的發送 帶權限的接收 安全注意事項和最佳做法 概述 Android 應用可以通過 Android …

數據分析案例-在線食品訂單數據可視化分析與建模分類

&#x1f935;?♂? 個人主頁&#xff1a;艾派森的個人主頁 ?&#x1f3fb;作者簡介&#xff1a;Python學習者 &#x1f40b; 希望大家多多支持&#xff0c;我們一起進步&#xff01;&#x1f604; 如果文章對你有幫助的話&#xff0c; 歡迎評論 &#x1f4ac;點贊&#x1f4…

springmvc揭秘參數解析

參數解析 說到參數解析&#xff0c;springmvc中處理參數的是HandlerMethodArgumentResolver接口 public interface HandlerMethodArgumentResolver { // 判斷是否支持該類型參數 boolean supportsParameter(MethodParameter parameter); // 進行參數解析 Object resolv…

[羊城杯 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…

學習Vue中圖片上傳前進行壓縮的實現方法

學習Vue中圖片上傳前進行壓縮的實現方法 一、前言1. 為什么要在客戶端進行圖片壓縮&#xff1f;2. Vue組件中實現圖片上傳前壓縮的方法3. 注意事項與優化4. 總結 一、前言 在Web開發中&#xff0c;圖片上傳是一個常見的功能需求&#xff0c;而客戶端對圖片進行壓縮可以有效減小…

企業如何進行快遞運費對賬?

在電子面單寄件取代手寫紙質面單之后&#xff0c;加上月結寄件模式的推行&#xff0c;企業快遞運費對賬&#xff0c;成了行政的一個難題...... 早期的手寫紙質面單寄件&#xff0c;企業行政或者財務相關人員&#xff0c;遵循寄前審批&#xff0c;寄后報銷的原則進行對賬。隨著電…