我一直认为x [i]相当于*(x+i)
。
因此x [i] [j]相当于*(*(x+i)+j)
,在这种情况下意味着2D数组必须实现为指针数组,这些指针中的每一个都有被解除引用。
但我了解到你可以这样在堆上创建一个2D数组:
char (*arr)[256]=malloc(512*256);
如果前一假设是正确的,那么arr [i] [j]将访问未经授权的位置(因为我们解除引用两次)。
我的前假设在2d阵列的情况下是错误的吗?
答案 0 :(得分:1)
x[i]
确实相当于*(x+i)
。指针运算以后一种形式使用。type array[x][y];
,则必须分几步应用上述规则。 array
在表达式中使用时,会衰减到指向第一个元素的指针,在这种情况下类型为type(*)[y]
- 指向第一个数组的数组指针数组数组。不要将数组指针与"指针数组#34;混淆,这意味着完全不同。array + i
对这样的数组指针执行指针运算。 *(array + i)
给出了指向的项目,一维数组。如果由于某些原因,想知道只想使用指针算法来访问2D数组中的单个项目,那么你就必须写一些像这样模糊不清的东西:
*( *(array + i) + j)
如果前一个假设是正确的,那么arr [i] [j]将访问一个 未经授权的位置(因为我们两次取消引用)。
嗯,这不对。如果有char (*arr)[256]
之类的数组指针,则可以arr[i][j]
访问这些项目。请注意arr[i]
执行相同类型的指针运算,因此您得到" char [256]数组编号i
"。然后在该数组中,您可以访问项目j
。
这实际上是使用此语法的原因。如果你写了malloc更正确的类型如下:
char (*arr)[512][256]=malloc( sizeof(char[512][256]) );
然后你必须在使用它之前取消引用数组指针(*arr)[i][j]
,否则你将在整个2D数组上获得指针算法。
问题Correctly allocating multi-dimensional arrays解释并说明了基于指针数组和真正的多维数组的查找表之间的差异。