[問題] 二維陣列傳遞問題

看板C_and_CPP (C/C++)作者 (Uncleuse)時間16年前 (2009/02/16 22:06), 編輯推噓8(8030)
留言38則, 5人參與, 最新討論串1/2 (看更多)
請問大家,我寫一個程式如下: #include<iostream> using namespace std; void PrintArray(int* a); int main( ) { int Num[2][5] = { 1,2,3,4,5, 6,7,8,9,10}; PrintArray(Num+5); // 這裡編譯有誤: // cannot convert `int (*)[5]' to `int*' // for argument `1' to `void PrintArray(int*)' getchar( ); return 0; } void PrintArray(int* a) { for(int i=0;i<5;i++) cout << a[i] <<" " ; } 但是,在我宣告Num[2][5]時,記憶體應該會是線性儲存變數: 1,2,3,4,5,6,7,8,9,10 我是將陣列名Num當成是指向第一個數字的指標, 所以我將Num+5之後應該就是指向6這個數字的指標, 然後再傳入PrintArray(int* a)試著將它印出. 但是編譯有誤, 請問我哪個觀念想錯? 感謝大家~~~~~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.64.114.55

02/16 22:19, , 1F
cannot convert `int (*)[5]' to `int*'
02/16 22:19, 1F

02/16 22:21, , 2F
這..強轉其實就可以了, 你的觀念並沒有錯
02/16 22:21, 2F

02/16 22:23, , 3F
只是compiler 比較strict 而已, 當然全部用一維陣列自己
02/16 22:23, 3F

02/16 22:23, , 4F
index 也可以, 我通常選擇後者.
02/16 22:23, 4F

02/17 10:02, , 5F
原來如此, 感謝回答!!
02/17 10:02, 5F

02/17 12:30, , 6F
應該有差吧? print 指標 Num+5 和 Num[1] 試試看 @_@"
02/17 12:30, 6F

02/17 12:30, , 7F
記憶體是連續的觀念沒錯, 但是Num是2D ptr的時候....
02/17 12:30, 7F

02/17 12:31, , 8F
Num + CONST後的位置會指到的地方不太對吧....?_?
02/17 12:31, 8F

02/17 12:33, , 9F
或者如你所想的試試Num+5 vs (int*)Num+5 的值 ?_?
02/17 12:33, 9F

02/17 17:22, , 10F
記憶體位址真的不一樣...
02/17 17:22, 10F

02/17 17:25, , 11F
請問宣告Num[2][5]之後, Num[1]是誰的位址呢?
02/17 17:25, 11F

02/17 17:26, , 12F
還有(int*)Num是什麼意思呢?
02/17 17:26, 12F

02/17 17:28, , 13F
我剛初學, 還請大家多多指教~~謝謝!!!!
02/17 17:28, 13F

02/17 17:56, , 14F
PrintArray(int** a) { printf("%d", *(*(a+1)+0));}
02/17 17:56, 14F

02/17 17:58, , 15F
main() { ... PrintArray(Num); ... }
02/17 17:58, 15F

02/17 18:05, , 16F
樓上的一樣有error, cannot convert `int (*)[5]' to
02/17 18:05, 16F

02/17 18:06, , 17F
`int**' for argument `1' to `int PrintArray(int**)'
02/17 18:06, 17F

02/17 18:13, , 18F
而且這種解析2D ptr的方式總覺得很危險會有問題....Orz
02/17 18:13, 18F

02/17 19:49, , 19F
#include <stdio.h>
02/17 19:49, 19F

02/17 19:49, , 20F
void PrintArray(int array2D[][5]);
02/17 19:49, 20F

02/17 19:49, , 21F
int main(int argc, char *argv[])
02/17 19:49, 21F

02/17 19:49, , 22F
{
02/17 19:49, 22F

02/17 19:50, , 23F
int Num[2][5] = {{1, 2, 3, 4, 5},{ 6, 7, 8, 9, 10}};
02/17 19:50, 23F

02/17 19:50, , 24F
PrintArray(Num);
02/17 19:50, 24F

02/17 19:50, , 25F
return 0;
02/17 19:50, 25F

02/17 19:50, , 26F
}
02/17 19:50, 26F

02/17 19:50, , 27F
void PrintArray(int array2D[][5])
02/17 19:50, 27F

02/17 19:51, , 28F
{ printf("%d \n", *(*(array2D+1)+0)); }
02/17 19:51, 28F

02/17 21:21, , 29F
所以是不是說當我宣告Num[2][5]時
02/17 21:21, 29F

02/17 21:24, , 30F
Num這個變數名代表一個指標
02/17 21:24, 30F

02/17 21:26, , 31F
且這個指標指向一個有兩個元素之陣列的開頭
02/17 21:26, 31F

02/17 21:27, , 32F
而這個陣列裡的兩個元素都是指標變數
02/17 21:27, 32F

02/17 21:29, , 33F
且這兩個指標變數分別指向另兩個陣列的開頭
02/17 21:29, 33F

02/17 21:30, , 34F
這兩個陣列裡都存有5個int型態的整數
02/17 21:30, 34F

02/17 21:30, , 35F
這樣的觀念對不對?
02/17 21:30, 35F

02/17 21:31, , 36F
很感激大家的回答~~
02/17 21:31, 36F

02/17 21:33, , 37F
請看c primer
02/17 21:33, 37F

02/18 02:19, , 38F
的確是我解釋不周到:p 有謝Tom 指正, 推
02/18 02:19, 38F
文章代碼(AID): #19cNBnj3 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #19cNBnj3 (C_and_CPP)