2012-09-24 74 views
4

我刚刚得到了解代码如何工作的任务。二维数组,*(pointerArray [i] + j)是什么?

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; 
    } 
} 

我courious有关的东西是*(pointerArray [I] + J),我认为这是同样的事情pointerArray [i] [j],因为你可以访问两种方式的元素,但任何人都可以告诉我,*()实际发生了什么?就像编译器如何知道im要求与pointerArray [i] [j]一样?

感谢您的答案!

+1

这或许有助于HTTP:// stackoverflow.com/questions/381542/in-c-arrays-why-is-this-true-a5-5a。另外,请不要使用家庭作业标签,因为它已被弃用 – chris

+0

其实'a [i]'是定义为'*(a + i)',对于a和i的任意组合,其中一个是指针,另一个是整数。 –

+0

好的,我会记住chris,谢谢。 – Destidom

回答

2

在这种情况下,*运营商是解引用运营商。它预先设定的值将是内存中将返回值的位置。

括号是分组加法操作,以便编译器知道这个添加的结果将用于解引用。这只是一个操作次序的例子。

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

*(pointerArray[i] + j)基本上意味着:?“查找pointerArray数据i第i行的开始,然后挑选该行的j个元素,并给我,价值

3

这样做pointerArray[i] + j,则请求元素pointerArray[i],这是一个int*,和增量,通过j指针(也返回一个int*)。 *(...)只是取消引用指针,并在该位置返回int*被称为解引用运算符(在这种情况下)。所以是的,这相当于pointerArray[i][j]