0

抱歉,但我对 c++ 还是很陌生 - 继上一个问题Aliasing vector correct之后,如何(*M)[i][j]*(M[i][j])不同(其中 M 是指向整数指针数组的指针)?

据我所知,似乎前者等同于*(*((*MPtr) + i) + j)),后者等同于*(*(*(MPtr + i) + j))(其中 MPtr 是指向 M 的指针)。但是,我不确定 (MPtr + i) 的含义 - 我应该如何解释这个?

4

2 回答 2

1
(M*)(i][j]

这是一个语法错误(实际上是两个)。如果你的意思是

T (*M)[i][j]

相反,这是一个指向i x j类型元素数组的指针的声明T。相比之下,

(*M)[i][j]

就其本身而言,是一个表达式,其中M要么是指向至少二维数组的指针,要么是指向指向指针的指针的指针。然后,M取消引用,并分别对结果数组双指针进行索引。

同样,表达式

*(M[i][j])

仅当M是指针数组(或任何重载的类)数组时才有效,这意味着“取消引用作为数组第 th 元素的operator*指针”。[i][j]M

编辑:索引似乎错误的原因是(假设它M是一个指向二维数组的指针):

(*M)[i][j] = M[0][i][j]

所以这是[i][j]数组的第 th 个元素(如预期的那样)。相比之下,

*(M[i][j]) = M[i][j][0]

M当指针仅指向一个数组时这是错误的(读取过去的数组边界会调用未定义的行为)。

于 2013-04-09T20:14:52.703 回答
1

当你有一个数组时,计算机会存储一个指向数组开头的指针。那是Mptr。如果你写 Mptr + i 就是要翻译成,Mptr 的内存地址 + 你的 Mptr 类型的大小 * i。

你写的sintax是错误的,因为你取消引用不是内存地址的M[i][j],除了如果你写*(M[i])而不是*M[i],我认为*具有更高的优先级,因此在第一种情况下,M + i 被解除引用并在第二次被重新引用,M 首先被解除引用,然后添加 i 并再次被解除引用 * ((*M) + i),这个相反的顺序将导致你的 i 表现像一个j。以您认为更具可读性的方式编写代码,所以不要像这样 * (* (* (MPtr + i) + j))。

于 2013-04-09T20:28:34.627 回答