抱歉,但我对 c++ 还是很陌生 - 继上一个问题Aliasing vector correct之后,如何(*M)[i][j]
和*(M[i][j])
不同(其中 M 是指向整数指针数组的指针)?
据我所知,似乎前者等同于*(*((*MPtr) + i) + j))
,后者等同于*(*(*(MPtr + i) + j))
(其中 MPtr 是指向 M 的指针)。但是,我不确定 (MPtr + i) 的含义 - 我应该如何解释这个?
抱歉,但我对 c++ 还是很陌生 - 继上一个问题Aliasing vector correct之后,如何(*M)[i][j]
和*(M[i][j])
不同(其中 M 是指向整数指针数组的指针)?
据我所知,似乎前者等同于*(*((*MPtr) + i) + j))
,后者等同于*(*(*(MPtr + i) + j))
(其中 MPtr 是指向 M 的指针)。但是,我不确定 (MPtr + i) 的含义 - 我应该如何解释这个?
(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
当指针仅指向一个数组时这是错误的(读取过去的数组边界会调用未定义的行为)。
当你有一个数组时,计算机会存储一个指向数组开头的指针。那是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))。