【问题标题】:pointer to 2 d matrix syntax指向二维矩阵语法的指针
【发布时间】:2013-04-09 20:08:30
【问题描述】:

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

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

【问题讨论】:

  • 第一个是(*M)[i][j]吗?
  • 是的,我就是这个意思,对不起!

标签: c++ arrays pointers syntax


【解决方案1】:
(M*)(i][j]

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

T (*M)[i][j]

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

(*M)[i][j]

本身是一个表达式,其中M 是指向至少二维数组的指针或指向指针的指针。然后,M 被取消引用,结果数组 双指针分别被索引。

同样,表达式

*(M[i][j])

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

编辑:索引看起来错误的原因是这样的(假设M 是一个指向二维数组的指针):

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

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

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

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

【讨论】:

  • 我认为他们的意思是 (*M)[i][j] 作为表达式(所以首先取消引用 M)。
  • @sftrabbit 我也添加了对该含义的解释,谢谢。
  • 哦,抱歉,但是,(*M)[i][j] 就是我的意思。 M 是指向整数指针数组的指针。所以我不太明白为什么 (*M)[i][j] 会给出与 *(M[i][j]) 不同的结果 - 为什么后者会给出 [j][i]th矩阵的元素而不是第 [i][j]th (这是我遇到的问题)?
  • @user1922001 因为这些是不同的表达方式。一个首先取消引用指针,然后为结果数组下标,另一个则相反。不管你是拿起降落伞然后跳出飞机,还是先跳出来然后才拿起降落伞……
  • @H2CO3 那么你的意思是取消引用实际上将二维数组的索引从 i-j 排序更改为 j-i 排序?具体来说,我很想知道为什么现在顺序颠倒了。
【解决方案2】:

当你有一个数组时,计算机会存储一个指向数组开头的指针。那是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))。

【讨论】:

  • 感谢您的回复,但我尝试使用指针偏移表示法来理解为什么 *(M[i][j]) 的行为类似于 (*M)[j][i] - 你发生了一些逆转是对的,但我不太明白你的解释。你所说的“相反的顺序会导致你的 i 表现得像 j”是什么意思?代码在第一种情况下执行所需的方式 (*M)[i][j],但在 *(M[i][j]) 中的顺序错误 - 表现得像 i 和 j 是相反的
  • @user1922001 我的意思是如果你写 *M[i] 将被翻译成 M[0][i] 因为 *M 将首先执行。如果你写 *(M[i]) 你告诉通勤者不要先执行 *M ,所以这将是 M[i][0] 因为 M[i] 将首先执行。它真的很复杂并且与称为优先级表的东西有关,我会告诉你 * 优先于运算符 [],除非你用括号另有定义,但实际上它说它们将从左到右执行。跨度>
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 2013-11-28
相关资源
最近更新 更多