道歉但我仍然对c ++很陌生 - 继上一个问题Aliasing vector correctly之后,(*M)[i][j]
和*(M[i][j])
如何不同(其中M是指向整数数组的指针)指针)?
据我所知,似乎前者等同于*(*((*MPtr) + i) + j))
,而后者与*(*(*(MPtr + i) + j))
相同(其中MPtr是指向M的指针)。但是,我不确定(MPtr + i)的含义 - 我应该如何解释这个?
答案 0 :(得分:1)
(M*)(i][j]
这是语法错误(实际上是两个)。如果你的意思是
T (*M)[i][j]
相反,这是指向i x j
类型T
元素数组的指针的声明。相比之下,
(*M)[i][j]
本身就是一个表达式,其中M
是指向至少2维数组的指针或指向指针指针的指针。然后,M
被取消引用,结果数组或双指针分别被索引。
同样,表达式
*(M[i][j])
仅在M
是指针数组(或任何重载operator*
的类)的数组时有效,并且它意味着“取消引用指针[i][j]
元素数组M
“。
编辑:索引似乎错误的原因是这个(假设M
是指向二维数组的指针):
(*M)[i][j] = M[0][i][j]
所以这是数组的[i][j]
元素(如预期的那样)。相比之下,
*(M[i][j]) = M[i][j][0]
当M
是仅指向一个数组的指针时读取错误(读取过去的数组边界会调用未定义的行为)。
答案 1 :(得分:1)
当你有一个数组时,计算机存储一个指向数组开始的指针。那是Mptr。如果你写的是Mptr + i,那就是goint被翻译为,Mptr的内存地址+你的Mptr类型的大小* i。
你写的sintax是错误的,因为你去除M [i] [j]什么不是一个记忆地址,除了你写*(M [i])而不是* M [i],我认为*具有更高的优先级,因此在第一种情况下,M + i被取消并且在第二次重新获得时,M首先被去除,然后再添加i并再次去除*((* M)+ i),这个相反的顺序将导致你的我表现得像个j。以你认为更可读的方式编写你的代码,所以不喜欢这个*(*(*(MPtr + i)+ j))。