矩阵int [5] [5]是否与int **相同​​?

时间:2014-08-06 08:53:58

标签: c

简单的一维数组被认为是一个指针,但它也是矩阵的情况吗?

但是,多维数据集int[5][5][5]也会被视为int ***

3 个答案:

答案 0 :(得分:10)

不,指向整数的指针与整数数组的数组不同。

考虑一下他们在记忆中的样子。

数组数组(例如int a[2][2]):

+---------+---------+---------+---------+
| a[0][0] | a[0][1] | a[1][0] | a[1][1] |
+---------+---------+---------+---------+

指针指针(例如int **a):

+------+------+------+
| a[0] | a[1] | .... |
+------+------+------+
   |      |
   |      v
   |      +---------+---------+---------+
   |      | A[1][0] | a[1][1] | ....... |
   |      +---------+---------+---------+
   v
   +---------+---------+---------+
   | A[0][0] | a[0][1] | ....... |
   +---------+---------+---------+

答案 1 :(得分:3)

不,他们不是。例如,考虑下面给出的两个声明。

int c[5][5][5];
int ***d;

对于第一个声明,内存要求是125 X 4 = 500 Bytes。

对于第二个声明,内存要求仅为4个字节。出于许多实际目的,我们可以在数组和指针之间进行交换,但它们并不相同。

答案 2 :(得分:2)

显然不是。整数数组的数组与指向整数的指针的指针不同。 Array是存储在连续内存位置的类似数据元素的集合。但指向整数的指针不是。

int a[5][5];

在此声明中,它将为所有元素分配连续的内存位置。说起始内存位置是1000。

array  starting   array elements
       address
a[0]--> 1000 --> a[0][0] a[0][1] ... a[0][4]
a[1]--> 1020 --> a[1][0] a[1][1] ... a[1][4]
a[2]--> 1040 --> a[2][0] a[2][1] ... a[2][4]
a[3]--> 1060 --> a[3][0] a[3][1] ... a[3][4]
a[4]--> 1080 --> a[4][0] a[4][1] ... a[4][4]

但是当你指向指向整数的指针时,就像这样 -

int **a;

为此分配内存 -

array --> a[0] a[1] a[2] a[3] a[4]  
address > 1000 1004 1008 1012 1016 // address of array which points to some other location

这将分配连续的内存位置。但是每个数组都会指向/保存元素的其他内存位置。

array's  array  element's   array elements
address         address
1000 --> a[0]--> 2000 --> a[0][0] a[0][1] ... a[0][4]
1004 --> a[1]--> 3000 --> a[1][0] a[1][1] ... a[1][4]
1008 --> a[2]--> 4000 --> a[2][0] a[2][1] ... a[2][4]
1012 --> a[3]--> 5000 --> a[3][0] a[3][1] ... a[3][4]
1016 --> a[4]--> 6000 --> a[4][0] a[4][1] ... a[4][4]

这些数组将元素的起始地址保存在不同的位置。

相关问题