2011-11-04 114 views
1

什么声明多维数组这样的区别:此声明多维数组:指针或数组Definiton

int* a[5];

int a[5][5];

或?

哪一个更好用?谢谢。

+0

: 而当列的数目是未知的,在2D阵列声明时间或列的数目可以在运行时改变或仅仅一个想要创建非矩形(锯齿状)阵列这样这个int * a[ROWS]符号用于你可能会发现http://cdecl.org/用于'解码'复杂的C声明。 – nimrodm

+1

[Is int * array \ [32 \]指向32个int的数组或指向int的32个指针的数组的可能重复?这是否重要?](http://stackoverflow.com/questions/1371898/is-int-array32-a-pointer-to-an-array-of-32-ints-or-an-array-of-32-指针-t) –

+0

相关问题:http://stackoverflow.com/q/7586702/51831 – jpalecek

回答

1

这两个可能被用来声明2维数组。

在第一种情况下,25个int元素被分配在内存中的连续区域中。 在这种情况下,表达式a[i][j]被编译器翻译为*(a + i*5 + j)

第二个分配5个指针到int。您可以通过分配int的向量并使这些指针指向这些向量来使其作为二维数组工作。 在这种情况下,a[i][j]表示获得指向a[i]指向的指针,然后查找该向量中的第5个元素。即a[i][j]被翻译为*(a[i] + j)

请注意,在第二种情况下,行不必具有相同的长度。

0

int a[5][5];说,编译器应该分配足够的内存来存储25个整数,并把它当作一个二维数组称为a

int* a[5];表示编译器应该分配足够的内存来存储指向整数的5个指针,并将其视为指向数组的指针a。要实际使用它作为一个二维数组,你将不得不分配更多的内存并初始化这些指针来指向它。例如:

int * a[5]; 
for(int i = 0; i < 5; i++){ a[i] = malloc(sizeof(int) * 5); } 

不知道您的要求,很难说哪一个更适合您。第二个允许你有效地交换两行,通常更灵活,但需要更多的代码来分配和释放数据结构。

0

哪个更好的苹果或橙子? 此符号int a[ROWS][COLS]用于创建尺寸在声明时已知的矩形2D阵列。

1 2 3 4 
4 6 
7 1 1 1 5 6 7 
9