二维数组,*(pointerArray [i] + j)是什么?

时间:2012-09-24 21:41:33

标签: c++ pointers multidimensional-array

我刚刚完成了查找此代码如何工作的任务。

int array[rows][coloums]; 
int *pointerArray[rows]; 
for (int i = 0; i < rows; i++) { 
  pointerArray[i] = array[i]; 
  for (int j = 0; j < coloums; j++) { 
   *(pointerArray[i] + j) = 0; 
  } 
}

我很喜欢的是*(pointerArray [i] + j),我认为它和pointerArray [i] [j]是一样的,因为你可以双向访问元素,但任何人都可以告诉我用*()实际发生了什么?就像编译器如何知道im请求与pointerArray [i] [j]相同?

感谢您的回答!

2 个答案:

答案 0 :(得分:3)

当您执行pointerArray[i] + j时,您请求pointerArray[i]元素int*,并将该指针递增j(同时返回int* )。 *(...)只是取消引用指针并返回该位置的int*称为解除引用运算符(在本例中)。所以是的,它相当于pointerArray[i][j]

答案 1 :(得分:2)

在此上下文中,*运算符是解除引用运算符。它预先设定的值将是内存中将返回值的位置。

括号对添加操作进行分组,以便编译器知道此添加的结果将用于取消引用。这只是一个操作顺序的例子。

请记住,[]运算符与解除引用运算符的作用相同,因为数组本质上是一种指针变量。如果您将二维数组想象为具有行和列的值的2D网格,则在内存中布置数据,使得每个行按顺序依次排列。数组中的第一个索引(i)以及数组的类型(int)告诉编译器在哪个偏移处查找行中的第一个位置。数组中的第二个索引(j)告诉它该行中的偏移量。

*(pointerArray[i] + j)基本上意味着:“在i中查找pointerArray行数据的开头,然后选择该行的j元素,并提供我有价值。