這不是一個問題,「我如何將它傳遞給函數?」而是,「這可以接受嗎?」On將2D陣列傳遞給函數
void func(int **ptr);
int main(int argc, char* argv[])
{
int arr[][3] = {{1, 2,}, {3, 4}, {5, 6}};
int *pArr = *arr;
(&pArr[0])[1] = 3;
func(&pArr);
cin.get();
return 0;
}
void func(int **ptr)
{
cout << "In func()" << endl;
ptr[0][1] = 5;
}
這可以工作,據我所知。它對我來說並不安全,但我更喜歡它將2D數組傳遞給函數。相反,一個指針可以爲我完成這項工作。
這對於那些必須閱讀我的代碼的人來說會非常困惑嗎?我應該使用其他方法嗎?使用指向數組的指針是不是一個好主意?
此外,問題有點偏題。我爲什麼可以這樣寫:
int arr[] = { 1, 2, 3, 4, 5 };
int *pArr = *arr;
但爲什麼我不能寫
int arr[][3] = {{1, 2,}, {3, 4}, {5, 6}};
int *pArr = **arr;
甚至用**帕爾?
感謝您的信息,但我不完全理解你的意思。 ptr [0] [1]確實覆蓋了數組的單元[0] [1]中的信息,那麼這不是我想要的? 然後,如果數組僅僅是一個9個單元的塊,那麼我真的可以使用一個指向數組的元素0..7的指針,而不是這樣做嗎?所以我基本上過分複雜的整個事情? – IAE 2010-07-06 12:30:48
@SoulBeaver:是的。 'arr'衰變成一個'int *',而不是'int **'。我在回答中回覆了您評論的第一部分。 – 2010-07-06 12:42:14
我已經低估了這個答案,因爲答案和回答者關於衰變的評論都是錯誤的。 'arr'不是一個指向內存的指針,但它本身就是一個內存塊(如果它是一個指針,它不需要衰減)。它衰變爲'int(*)[3]',而不是'int *'。對於這個問題,我想說整個'(&pArr [0])[1]'和'pArr [1]'是一樣的。我懷疑他想編寫'(&pArr)[0] [1]'來模擬在函數中完成的訪問。但是他的整個代碼對我來說沒有意義。我懷疑他很困惑。請更正答案,我會收回我的downvote,隊友。 – 2010-07-06 13:05:09