C / C++ 函式傳遞二維陣列範例與解說 - CHG

文章推薦指數: 80 %
投票人數:10人

template void fun(int (&arr)[N][N2]) {...}; 如此一來就可以完整的傳入鎮列了,在函式內N1 及N2 就是傳入的二維長度 ... 2017年11月13日星期一 C/C++函式傳遞二維陣列範例與解說 C/C++函式傳遞二維陣列範例與解說一維陣列的傳遞一維陣列常見的方法是這樣傳遞的voidfun(int*p){...} intarr[10]={}; fun(arr); 這時候編譯器會自動將 型態::int[10] 轉成 型態::int* 然後成功的傳遞但是這裡有個但書,只有最高維度可以自動轉換或計算,剩下的皆要手動指定舉個例子來說明//錯誤 intarr[][]={{0,1},{2,3}}; //正確 intarr[][2]={{0,1},{2,3}}; 編譯器只會自動補上最左邊的[],只有最左邊可以留空在函式上二維的傳遞方式也是一樣的邏輯,想傳遞這個二維可以改成這樣//寫法1 voidfun(intp[][2]){...} //寫法2(等價於第一種,看個人習慣選擇即可) voidfun(int(*p)[2]){...} 這樣就可以正常傳遞了,只是有個缺點二維的長度被限制了。

不定長度的二維傳遞-手動轉型那如果要傳遞不定長的二維就必須使用指標的指標 int** 來傳遞不過這樣的用法沒辦法直接從int(*)[n] 轉型,必須手動轉型如果想要自動轉型成 int** 反推一下就要使用 int* 的陣列來轉型int 的陣列是一個陣列裡面放著一堆intint* 的陣列是一個陣列裡面放著一堆int*就是說二維陣列,可以想像成有一個一維陣列裡面放著一堆一維陣列//宣告二維陣列 intarr1[2][2]={{1,2},{3,4}}; //取出一維陣列位址 int*a1=arr1[0]; int*a2=arr1[1]; //把一維地址寫進陣列裡 int*p1[2]; p1[0]=a1; p1[1]=a2; 現在p1可以自動轉型成 int** 了,可以將它傳入了 int** 的函式內了會弄得這麼麻煩是因為維度的長度,本身就屬於型態的一部分。

陣列長度10跟陣列長度11的差別就好像int跟char的差別一樣完全是不一樣的東西而編譯器只會幫你處理最高維度的自動計算而已,所以二維以上不定長度的傳遞在C語言上比較棘手。

C++的話有樣板可以自動處理就沒這個困擾了。

範例/***************************************************************************** Name: Date:2018/06/13 By:CharlotteHonG Final:2018/06/13 *****************************************************************************/ #include #include #defineWIDTH2 #defineHEIGHT3 voidfun(int**p){ for(intj=0;j voidfun(int(&arr)[N][N2]){...}; 如此一來就可以完整的傳入鎮列了,在函式內N1及N2就是傳入的二維長度,一維或是三維以上只要調整N的數量對應即可。

張貼者: Charlotte.HonG 於 下午4:12 以電子郵件傳送這篇文章BlogThis!分享至Twitter分享至Facebook分享到Pinterest 沒有留言: 張貼留言 較新的文章 較舊的文章 首頁 訂閱: 張貼留言(Atom) 卷軸樣式 網站贊助 熱門文章 一次弄懂硬碟C4C5C605警告意思及如何修復 一次弄懂硬碟C4C5C605警告意思及如何修復C5是什麼資料損毀=未知、壞軌=未知C5就是掃到某個磁軌有問題標記起來,但是還沒有做檢查不知道到底是好是壞,有可能是複製中斷電導致檔案壞了磁頭還沒寫好,這種狀態重寫一次就好了C5自動消失。

... 升級Windsows11不用重灌MBR轉GPT [圖/影]2022升級Windsows11不用重灌MBR轉GPT不管是要升級Windows10的版本出現,無法安裝windows因為此電腦的磁碟配置不受uefi韌體支援,或是升級Windows11時無法升級,此電腦必須支援安全開機選項等等都可以用這個方法處理... C/C++函式傳遞二維陣列範例與解說 C/C++函式傳遞二維陣列範例與解說一維陣列的傳遞一維陣列常見的方法是這樣傳遞的voidfun(int*p){...}intarr[10]={};fun(arr);這時候編譯器會自動將 型態::int[10] 轉成 型態::int*... 2022電腦版line來電鈴聲自訂或靜音 2022電腦版line來電鈴聲自訂或靜音相信大家對於line的來電提醒,電腦和手機同時響非常惱火吧,偏偏從設定裡面又不能關掉,設定裡的指示關訊息提醒,來電提醒照樣會響,只有手機條靜音模式可以安靜一下,電腦版完全就不給你關,也無法修改。

line不知道哪根經不對禁止使用者把... Windows系統MBR轉GPT(EFI)無損資料可開機不須重灌系統 Windows系統MBR轉GPT(EFI)無損資料可開機不須重灌系統重新寫一篇比較簡潔的文章,有影片操作過程,建議直接看這篇-[圖/影]升級Windsows11不用重灌MBR轉GPT  https://charlottehong.blogs... 贊助的金額 NT$50TWD NT$100TWD NT$300TWD 贊助Charlotte.HonG 最近7天 關於我自己 Charlotte.HonG 檢視我的完整簡介 網誌存檔 ►  2022 (32) ►  六月 (5) ►  五月 (1) ►  四月 (1) ►  三月 (4) ►  二月 (11) ►  一月 (10) ►  2021 (47) ►  十二月 (4) ►  十一月 (4) ►  十月 (2) ►  九月 (4) ►  八月 (7) ►  七月 (1) ►  六月 (1) ►  五月 (8) ►  四月 (8) ►  三月 (1) ►  二月 (2) ►  一月 (5) ►  2020 (16) ►  十二月 (1) ►  十一月 (2) ►  十月 (1) ►  九月 (3) ►  七月 (4) ►  五月 (1) ►  四月 (1) ►  三月 (1) ►  一月 (2) ►  2019 (26) ►  十二月 (2) ►  九月 (1) ►  八月 (3) ►  七月 (3) ►  六月 (2) ►  五月 (2) ►  四月 (2) ►  二月 (5) ►  一月 (6) ►  2018 (121) ►  十二月 (1) ►  十一月 (1) ►  十月 (1) ►  九月 (6) ►  八月 (4) ►  七月 (6) ►  六月 (14) ►  五月 (21) ►  四月 (11) ►  三月 (24) ►  二月 (21) ►  一月 (11) ▼  2017 (138) ►  十二月 (12) ▼  十一月 (10) Centos7配置Samba共享資料夾和印表機 Windows系統GPT(EFI)轉MBR無損資料可開機不須重灌系統 Windows系統MBR轉GPT(EFI)無損資料可開機不須重灌系統 [原始碼]C/C++旋轉任意角度的圖片 sim卡轉接卡空卡插進去拔不出來卡住 [原始碼]C/C++線性插補bilinear與注意事項 微信支付只綁定台灣信用卡,使用權限與金額上限 C/C++函式傳遞二維陣列範例與解說 VisualStudio2017stdio.hwinres.hatlbase.h找不到 AndroidSONY手機Z、XZ系列OTG接上後毫無反應 ►  十月 (10) ►  九月 (9) ►  八月 (10) ►  七月 (12) ►  六月 (10) ►  五月 (14) ►  四月 (5) ►  三月 (25) ►  二月 (7) ►  一月 (14) ►  2016 (84) ►  十二月 (15) ►  十一月 (10) ►  十月 (13) ►  九月 (10) ►  八月 (12) ►  七月 (7) ►  五月 (4) ►  四月 (6) ►  二月 (5) ►  一月 (2) ►  2015 (10) ►  十一月 (1) ►  八月 (6) ►  六月 (1) ►  五月 (2)



請為這篇文章評分?