我一直相信在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]
的指针,依此类推。所以我认为它类似于一个指针数组。他们之间有什么区别?
答案 0 :(得分:3)
数组和指针在C(和C ++)中有一种非常好奇和亲密的关系。在大多数情况下,如果你有一个'X数组',那么它将被静默转换为指向数组第一个元素的'指针X'。
你的信念
int a[5][3];
创建一个数组数组是完全正确的。根据声明,它是一个array of 5 arrays of 3 ints
,它在内存中占据了15个连续的整数。
你出错的地方是相信a[0]
是一个指针。事实上,a[0]
是a
的第一个子数组,本身就是array of 3 ints
。但是,由于指针和数组之间的奇怪关系,表达式a[0]
几乎总是转换为指针。
数组数组和指针数组之间的主要区别之一是数组元素所在的位置。数组数组总是占用一块连续的内存块,但是指针数组中的指针每个都会引用它们自己的(通常是不相交的)内存块。
答案 1 :(得分:0)
数组和指针松散地等同于同一个东西。当你声明一个N长的数组时,你要分配一个N长的内存块(乘以值类型的大小)并将指针返回给第一个元素。像arr[2]
这样的表达式然后通过从第一个指针向前计数从该存储器中检索一个值。如果你有一个数组数组,那么你在第一个数组中存储的所有数据(在a
数组中)都是指向其他数组存储位置的指针。 (那就是说,我相信他们应该像你说的那样处于一个连续的区域)
这有助于解释吗?
答案 2 :(得分:0)
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
放在一边,加上五个单元格
指针。
指针数组的重要优点是数组的行可能是
不同的长度。也就是说,b
的每个元素都不需要指向一个三元素向量
可能指向两个元素,一些到九个,一些到没有。