[問題] 二維陣列與雙重指標關係

看板C_and_CPP作者 (小小涼)時間9年前 (2014/11/19 15:18), 9年前編輯推噓7(7011)
留言18則, 6人參與, 最新討論串1/3 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) codeblock GCC 4.8.1 最近在學C++ 遇到雙重指標與多維陣列問題 有看到一個網頁上 int x[1][20]; int (*p)[20] = x; 比較常用以下寫法 int **p=(int**)x; 接著我想測試那個常用寫法是否可以就自己寫了一個小程式 int a1[3][2] ; int** a2 = (int**)a1 ; int count=0; for (int i = 0; i < 3; ++i){ for (int j = 0; j < 2; ++j){ a1[i][j] = ++count; std::cout << "a1["<<i<<"]["<<j<<"] :" << a1[i][j] <<"\t"; std::cout << "a2["<<i<<"]["<<j<<"] :" << *((*a2+i)+j) <<"\t"; } printf("\n"); } 我想說 如果 a1給值的話 照理說 a2也應該有設定到值 compiler沒有問題 但是 執行之後 dos畫面 會寫 沒有回應 就停止程式 不知道是甚麼原因? 我有上網查過 用雙重指標表示二維陣列的其他寫法 還是想問一下 這樣寫為什麼有錯誤? 感謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 163.15.165.131 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1416381491.A.60A.html ※ 編輯: ipod7788 (163.15.165.131), 11/19/2014 15:18:48

11/19 15:29, , 1F
*(a2+i)? (*a2+i)?
11/19 15:29, 1F
請問 要這樣寫嗎? *(a2+i)+j 剛剛試過 結果會印出 6個不同的記憶體位置 所以我又加上 *(*(a2+i)+j) 執行後就會出現 array.exe (array是我的project名字)沒有回應

11/19 17:09, , 2F
a2 這種寫法,你要在執行時期配置記憶體,也就是要作 new
11/19 17:09, 2F

11/19 17:10, , 3F
程式當掉,應該會有錯誤訊息,那很重要
11/19 17:10, 3F

11/19 17:12, , 4F
如果你要把 a2 指向 a1 的話,應該用 int (a2)[2] = a1;
11/19 17:12, 4F

11/19 17:12, , 5F
少打 int (*a2)[2] = a1;
11/19 17:12, 5F
我有上網找 好像寫法會略有不同 int **a2; a2 = new int*[10]; 可是這樣 a1給值 好像 就與a2無關 文章上說的錯誤是指 執行後 會出現 array.exe (array是 project名稱) 沒有回應 感覺是存取錯誤的記憶體位置 才發生這種問題

11/19 17:13, , 6F
原po寫法等於*(*a2+i+j) , 一樓已提示囉
11/19 17:13, 6F

11/19 17:18, , 7F
*(a2 + i * 2 + j)
11/19 17:18, 7F
這個寫法 剛剛試過 也是不行 好像是要 int a1[3][2] ; int* a2 =(int*)a1; 就可以正確取值 ※ 編輯: ipod7788 (163.15.165.131), 11/19/2014 18:04:19

11/19 18:05, , 8F
哪個網頁教你可以用雙重指標接二維陣列的阿
11/19 18:05, 8F
http://ppt.cc/mxeN 其實他也沒有教 他好像是說這樣普遍寫法是這樣(!?) ※ 編輯: ipod7788 (163.15.165.131), 11/19/2014 18:12:44

11/19 18:22, , 9F
疏忽了orz purpose與s25g5d4說的對
11/19 18:22, 9F

11/19 18:27, , 10F
我甚麼都沒說阿?
11/19 18:27, 10F

11/19 18:34, , 11F
首先你要知道 a1 會指向 a[0][0] 這樣你就知道為什麼
11/19 18:34, 11F

11/19 18:34, , 12F
不能用雙重指標接二維陣列了
11/19 18:34, 12F

11/19 20:51, , 13F
我猜你意思是不能用,所以說你說的對 XD
11/19 20:51, 13F
所以那個網頁寫的是錯的嗎? int a[2][3]; int** a2=(int**) al <--這個 另外想請問一下 這樣寫法 int(*) a2 = (int*)a1 是轉二維轉成 一維陣列的意思嗎? ※ 編輯: ipod7788 (114.39.0.63), 11/19/2014 22:34:22

11/19 23:07, , 14F
http://goo.gl/OeDeTY 你說的那個網頁,後來有人留言了
11/19 23:07, 14F
謝謝提醒~ 我還想說那篇文章評價蠻高的 應該不太會有錯 ※ 編輯: ipod7788 (114.39.0.63), 11/20/2014 00:23:01

11/20 09:56, , 15F
更正一下 *((int*)a2 + i * 2 + j)
11/20 09:56, 15F

11/20 09:56, , 16F
11/20 09:56, 16F

11/20 12:04, , 17F
代表在C/C++主題上這個板比該網站稍稍略勝一籌
11/20 12:04, 17F

11/21 09:28, , 18F
兩邊都看 不一樣就可以跟板友討論一下XD
11/21 09:28, 18F
文章代碼(AID): #1KR4GpOA (C_and_CPP)
文章代碼(AID): #1KR4GpOA (C_and_CPP)