看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
nctucch17170: *(a2+i)? (*a2+i)? 11/19 15:29
請問 要這樣寫嗎? *(a2+i)+j 剛剛試過 結果會印出 6個不同的記憶體位置 所以我又加上 *(*(a2+i)+j) 執行後就會出現 array.exe (array是我的project名字)沒有回應
purpose: a2 這種寫法,你要在執行時期配置記憶體,也就是要作 new 11/19 17:09
purpose: 程式當掉,應該會有錯誤訊息,那很重要 11/19 17:10
purpose: 如果你要把 a2 指向 a1 的話,應該用 int (a2)[2] = a1; 11/19 17:12
purpose: 少打 int (*a2)[2] = a1; 11/19 17:12
我有上網找 好像寫法會略有不同 int **a2; a2 = new int*[10]; 可是這樣 a1給值 好像 就與a2無關 文章上說的錯誤是指 執行後 會出現 array.exe (array是 project名稱) 沒有回應 感覺是存取錯誤的記憶體位置 才發生這種問題
dirkc: 原po寫法等於*(*a2+i+j) , 一樓已提示囉 11/19 17:13
ichleibeqbi: *(a2 + i * 2 + j) 11/19 17:18
這個寫法 剛剛試過 也是不行 好像是要 int a1[3][2] ; int* a2 =(int*)a1; 就可以正確取值 ※ 編輯: ipod7788 (163.15.165.131), 11/19/2014 18:04:19
s25g5d4: 哪個網頁教你可以用雙重指標接二維陣列的阿 11/19 18:05
http://ppt.cc/mxeN 其實他也沒有教 他好像是說這樣普遍寫法是這樣(!?) ※ 編輯: ipod7788 (163.15.165.131), 11/19/2014 18:12:44
dirkc: 疏忽了orz purpose與s25g5d4說的對 11/19 18:22
s25g5d4: 我甚麼都沒說阿? 11/19 18:27
s25g5d4: 首先你要知道 a1 會指向 a[0][0] 這樣你就知道為什麼 11/19 18:34
s25g5d4: 不能用雙重指標接二維陣列了 11/19 18:34
dirkc: 我猜你意思是不能用,所以說你說的對 XD 11/19 20:51
所以那個網頁寫的是錯的嗎? int a[2][3]; int** a2=(int**) al <--這個 另外想請問一下 這樣寫法 int(*) a2 = (int*)a1 是轉二維轉成 一維陣列的意思嗎? ※ 編輯: ipod7788 (114.39.0.63), 11/19/2014 22:34:22
purpose: http://goo.gl/OeDeTY 你說的那個網頁,後來有人留言了 11/19 23:07
謝謝提醒~ 我還想說那篇文章評價蠻高的 應該不太會有錯 ※ 編輯: ipod7788 (114.39.0.63), 11/20/2014 00:23:01
ichleibeqbi: 更正一下 *((int*)a2 + i * 2 + j) 11/20 09:56
ichleibeqbi: 參考: http://ppt.cc/cAOc 11/20 09:56
dirkc: 代表在C/C++主題上這個板比該網站稍稍略勝一籌 11/20 12:04
ipod7788: 兩邊都看 不一樣就可以跟板友討論一下XD 11/21 09:28