【问题标题】:Two dimensional array, what does *(pointerArray[i] + j)?二维数组,*(pointerArray[i] + j) 是什么?
【发布时间】:2012-09-16 09:40:37
【问题描述】:

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

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] 相同的?

感谢您的回答!

【问题讨论】:

  • 也许这有帮助? stackoverflow.com/questions/381542/…。另外,请不要使用 homework 标签,因为它已被弃用。
  • 实际上a[i] 被定义为*(a+i) 用于a 和I 的任意组合,其中一个是指针,另一个是整数。
  • 好的,我会记住的,克里斯,谢谢。

标签: c++ pointers multidimensional-array


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在此上下文中,* 运算符是 取消引用运算符。它前面的值将是内存中返回值的位置。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 2014-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多