我刚刚完成了查找此代码如何工作的任务。
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]相同?
感谢您的回答!
答案 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
元素,并提供我有价值。