[] []的含义是否特定于上下文?

时间:2017-04-18 13:47:10

标签: c++ c arrays

我一直认为x [i]相当于*(x+i)。 因此x [i] [j]相当于*(*(x+i)+j),在这种情况下意味着2D数组必须实现为指针数组,这些指针中的每一个都有被解除引用。

但我了解到你可以这样在堆上创建一个2D数组:

char (*arr)[256]=malloc(512*256);

如果前一假设是正确的,那么arr [i] [j]将访问未经授权的位置(因为我们解除引用两次)。

我的前假设在2d阵列的情况下是错误的吗?

1 个答案:

答案 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解释并说明了基于指针数组和真正的多维数组的查找表之间的差异。