多维数组和指针数组之间的区别

我一直相信在C:

int a[5][3]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; 

指的是一个数组数组,在存储器中存储了十五个连续的块,但是a[0]是指向a[0][0]的指针,而a[1]是指向a[1][0]的指针,依此类推。 所以我认为它类似于一个指针数组。 它们之间有什么区别?

数组和指针在C(和C ++)中有一种非常好奇和亲密的关系。 在大多数情况下,如果你有一个’X数组’,那么它将被静默转换为指向数组第一个元素的’指针X’。

你的信念

 int a[5][3]; 

创建一个数组数组是完全正确的。 根据声明,它是一个array of 5 arrays of 3 ints它在内存中占据15个连续的整数。

你出错的地方是认为a[0]是一个指针。 事实上, a[0]是a的第一个子数组,本身就是一个array of 3 intsarray of 3 ints 。 但是,由于指针和数组之间的奇怪关系,表达式a[0]几乎总是转换为指针。

数组数组和指针数组之间的主要区别之一是数组元素所在的位置。 数组数组总是占用一块连续的内存块,但是指针数组中的指针将分别指向它们自己的(通常是不相交的)内存块。

数组和指针松散地等同于同一个东西。 当你声明一个N长的数组时,你要分配一个N长的内存块(乘以值类型的大小)并将指针返回给第一个元素。 像arr[2]这样的表达式然后通过从第一个指针向前计数从该存储器中检索一个值。 如果你有一个数组数组,那么你在第一个数组(在你a数组中)存储的是指向其他数组存储位置的指针。 (那就是说,我相信他们应该像你说的那样处于一个连续的区域)

这有点帮助解释吗?

  int a[5][3]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; 

这是一个真正的二维数组:已经预留了15个int大小的位置,并使用传统的矩形下标来查找元素a[row][col]

 int *b[5]; 

这是一个指针数组,它分配5个指针并且没有初始化,但是a[3][2]b[3][2]都是对单个int的语法合法引用。

假设b每个元素确实指向一个三元素数组,那么将有15 ints被放置,另外还有五个用于指针的单元格。

指针arrays的重要优点是arrays的行可以具有不同的长度。 也就是说, b每个元素不需要指向三元素向量,一些可以指向两个元素,一些指向九个元素,一些指向任何一个元素。