指向2 d矩阵语法

时间:2013-04-09 20:08:30

标签: c++ arrays pointers syntax

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

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

2 个答案:

答案 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))。