4

我刚刚得到了找出这段代码是如何工作的任务。

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] 相同,因为您可以通过两种方式访问​​元素,但是谁能告诉我什么是实际发生在 *() 上?就像编译器如何知道我要求与 pointerArray[i][j] 相同的内容?

感谢您的回答!

4

2 回答 2

3

当你这样做时pointerArray[i] + j,你请求元素pointerArray[i],它是 a int*,并增加该指针j(也返回一个int*)。*(...)简单地取消引用指针并返回该位置int的。*被称为解引用运算符(在这种情况下)。所以是的,它相当于pointerArray[i][j].

于 2012-09-24T21:43:13.760 回答
2

在这种情况下,*操作符是解引用操作符。它前面的值将是内存中返回值的位置。

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

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

*(pointerArray[i] + j)i基本意思是:“在 中找到第 th 行数据的开头pointerArray,然后选择该j行的第 th 元素,并给我那个值。

于 2012-09-24T21:50:04.007 回答