Как правильно разыменовывать многомерные массивы без [] -оператора - PullRequest
0 голосов
/ 29 сентября 2011

Итак, я выяснил, как разыменовать многомерный массив, например так:

#include <tchar.h>
#include <iostream>

wchar_t g_pppwcSymbol[2][3][4];

int main(int argc, TCHAR **argv) 
 {
     (* (*( (*(g_pppwcSymbol+1) )+2 )+3 ) ) = L'K';
     std::wcout<<g_pppwcSymbol[1][2][3];
     std::wcin.get();
     return 0;
 }

Выход: K

Однако я также слышал, что компилятор преобразует это в одномерный массив, это правильно? Это будет означать, что все элементы wchar_t следуют друг за другом в памяти. Так что должен быть способ сделать что-то вроде этого:

***(g_pppwcSymbol + x) = value;

Однако я не уверен, как именно это работает. Может кто-нибудь уточнить?


EDIT:

похоже, это работает до сих пор:

int main(int argc, TCHAR **argv) 
 {
     /*(* (*( (*(g_pppwcSymbol+1) )+2 ) + 3)) = L'K';*/
     /*std::wcout<<g_pppwcSymbol[1][2][3];*/
     ***(g_pppwcSymbol + 1) = L'K';
     std::wcout<<g_pppwcSymbol[1][0][0];
     std::wcin.get();
     return 0;
 }

вывод: K


СЛЕДУЮЩАЯ ПРАВКА:

Рабочая модель:

static const int X = 2;
static const int Y = 3;
static const int Z = 4;
wchar_t g_pppwcSymbol[X][Y][Z];

int main(int argc, TCHAR **argv) 
 {
     int iAccess = ((Y*Z) * 1) + ((Z) * 2) + 3;
     *( (**g_pppwcSymbol) +  iAccess) = L'K';
     std::wcout<<g_pppwcSymbol[1][2][3];
     std::wcin.get();
     return 0;
 }

Вывод: K

1 Ответ

1 голос
/ 29 сентября 2011

Компилятор на самом деле превращает оператор [] в эти математические вычисления, так что вы проделаете этот трудный путь ... Но это интересное упражнение, поэтому я буду подыгрывать.


g_pppwcSymbol[2][3][4] - это массив из 2 элементов, большой массив из 3 элементов, большой массив из 4 элементов.Таким образом,

g_pppwcSymbol + ((3 * 4) /* size of first level array element */ * 1) + (4 /* size of second level array element */ * 2) + 1 /* size of third level array element */ * 3;

должен дать вам позицию последнего элемента последнего массива последнего массива.Пока каждый элемент имеет размер 1 байт.

Массив просто является областью памяти размером "element_count * element_size, а оператор [] принимает местоположение массива в качестве указателя и добавляет element_size * index. Он может содержать другие массивы, поскольку он может вычислять их размеры так же, как и другие структуры памяти.

Кстати, я уверен, что вы найдете множество документации по этому вопросу во всех деталях.через интернет.

...