2014-02-19 187 views
1

我知道,很多人被告知它,但我無法找到我需要的明確參考。通過指針訪問多維數組

我需要一個結構成員,它將指向一個二維數組。數組大小不固定,結構的每個實例都將指向具有不同大小的數組。

我想到了以下方法:

struct towDimByPtr 
{ 
    int NumRow; 
    int NumCol; 
    int* ptr2TwoDim; 
}; 

然後,我將有全局:

int arr1[30][90]; 
int arr2[20][10]; 

towDimByPtr towDim1; 
towDimByPtr towDim2; 

在初始化我會做到:

towDim1.ptr2TwoDim = arr1; 
towDim1.NumRow = 30; 
towDim1.NumCol = 90; 
towDim2.ptr2TwoDim = arr2; 
towDim2.NumRow = 20; 
towDim2.NumCol = 10; 

最後訪問的時我將使用的元素:

towDim1[curr_row*NumCol + curr_col] 

我的問題:這會一直工作嗎?

+0

C和C++是[行 - 主要順序](http://en.wikipedia.org/wiki/Row_major)語言,所以只要你堅持,它應該工作。但我不會推薦使用它,因爲它很混亂。 –

+0

@JoachimPileborg,謝謝。你能否提供一個參考? – Subway

回答

4

這個作業將無法正常工作:

towDim1.ptr2TwoDim = arr1; 

arr1衰變爲int (*)[90],不int *。你必須這樣做使用指針的第一個元素這項任務,如:

towDim1.ptr2TwoDim = &arr1[0][0]; 

或者等價地,

towDim1.ptr2TwoDim = arr1[0]; 

這同樣適用於towDim2.ptr2TwoDim = arr2;

除此之外,只要你確保curr_rowcurr_col不是越界,那麼是的,它會一直工作。

+0

謝謝菲利普。您能否提供一個關於多維數組保證以這種方式存儲的事實的參考? – Subway

+0

@Subway是的,你可以在關於C的維基百科頁面上看到它:http://zh.wikipedia.org/wiki/C_%28programming_language%29#Arrays 對於更正式的參考,C90似乎對F節.2.5,「陣列存儲」(請參閱​​http://docs.oracle.com/cd/E19205-01/819-5265/bjbdp/index.html)。它說「C數組以行優先順序存儲;多維數組中的最後一個下標變化最快。」 –

+1

@Subway剛剛在C99上檢查了這是在第6.5.2.1節的第3段:「[...]由此得出,數組以行優先順序存儲(最後一個下標變化最快)」。 –