2012-02-23 29 views
2

天兒真好所有,設置指針二維數組,然後傳遞一個指針到一個函數

我知道這已經討論了很多,但我仍然無法找到我所需要的。我對C非常陌生,並且還在圍繞着指針,即指向多維數組的指針。

我看過例子,如int a[2][3]; int (*p) = a當a是一個二維數組,但括號是做什麼的?

我正在創建一個2D數組作爲變量的程序,它需要將該數組傳遞給外部函數來修改它。

我的數組initilised這樣的:

unsigned int node[3][2]={ {PINB,PINC}, {0,0}, {0,0} };

我認爲要做到這一點的最好辦法是通過指針,但我不知道如何設置這需要在2D原型爲我的功能陣列。

這是函數IM將它傳遞給我怎麼稱呼它:

NodeToMIDI(node, i, pMIDIdata);

這是它的原型://其中「node_pointer」是二維數組ARG。

void NodeToMIDI(unsigned int node_pointer, unsigned int node_select, unsigned int * MidiPacket);

能有人請解釋的語法和邏輯的背後是如何做到這一點。我看過的其他一些線程有我未知的語法。例如int ** a

感謝您的幫助! Andrew。

回答

1

你正在尋找的簽名是:

void NodeToMIDI(unsigned node_pointer[][2], unsigned node_select, unsigned * MidiPacket); 

,你會打電話

NodeToMIDI(node, /*something*/, /*something else*/); 
-1

一些背景資料:

一個數組的行爲有點像一個指針。如果您有char* name = {"John"};,則可以訪問名稱爲[2] = h的字符。 名稱[0](第一個元素)與您直接使用指針名稱相同。指針name引用數組中第一個元素的地址。

因此,一個數組上的數組是一個指向指針的指針。這看起來像你所描述的。

int ** a; 

所以這是一個int指針,它指向另一個指向特定地址的int指針。

因此,您可以將unsigned int** arrayOfArray作爲函數參數。 然後你可以像你從數組中知道的那樣訪問元素。

arrayOfArray[0][2] = 42; 
2

您可以通過陣列的功能自然只有當你知道(在編譯時)內數組的大小。

您看到的示例可能是int a[2][3]; int (*p)[3] = a。括號表示p是指向3個int的數組的指針,而不是指向int的3個指針的數組。由於您可以像數組一樣取消引用指針,因此您可以使用p,就好像它是一個由3個整數組成的數組(其中a是)。

以同樣的方式,你可以編寫一個像void myfunc(int (*arr)[3]);這樣的原型 - 如果你傳遞a到這個函數,它就像傳遞數組到函數一樣獲取指針。

還有另外一種方法來編寫這個原型:void myfunc(int arr[][3]); - 編譯器會以同樣的方式理解它,有些人認爲這樣寫更容易理解。