2014-02-19 150 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段:“[...]由此得出,数组以行优先顺序存储(最后一个下标变化最快)”。 –