指向二维矩阵语法的指针

pointer to 2 d matrix syntax

本文关键字:语法 指针 二维      更新时间:2023-10-16

抱歉,但我对c++仍然很陌生-从之前的问题正确Aliasing vector, (*M)[i][j]*(M[i][j])是如何不同的(其中M是指向整数指针数组的指针)?

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

(M*)(i][j]

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

T (*M)[i][j]
而不是

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

(*M)[i][j]

本身是一个表达式,其中M要么是指向至少二维数组的指针,要么是指向指向指针的指针。然后对M解引用,得到的数组双指针分别被索引。

类似地,表达式
*(M[i][j])

仅当M是指针数组的数组(或重载operator*的任何类)时有效,并且它表示"解除对数组M[i][j]元素的指针的引用"。

编辑:索引错误的原因是(假设M是一个指向二维数组的指针):
(*M)[i][j] = M[0][i][j]

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

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

这是错误的,当M是一个指针,只有一个数组(读取超过数组边界调用未定义的行为)。

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

sintax你写的是错误的,因为你dereferate M[我][j]不是一个内存地址,除此之外,如果你写* (M[我]),而不是* M[我],我认为*更高的领先,在第一种情况下M +我得到dereferated和redereferated secound M得到dereferated第一,又说我和dereferated * ((*) + i),这相反的顺序会导致你的我像一个j .编写代码的方式你认为它更可读,不喜欢这 * (* (* ( MPtr + i) + j) .