(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
".
Edit: причина, почему индексация кажется это неверно (при условии, что M
является указателем на двумерный массив):
(*M)[i][j] = M[0][i][j]
так это [i][j]
й элемент массива (как и ожидалось). В отличие от этого,
*(M[i][j]) = M[i][j][0]
что неправильно, когда M
является указателем только один массив (чтение прошлых границ массива вызывает неопределенное поведение).
Вы имеете в виду '(* M) [i] [j]' для первого? –
Да, это то, что я имел в виду, извините! – UserUnspecified