Я знаю, что статические массивы выложены смежно в памяти. Так, например, int T[10][10]
в основном хранится так же, как int T[100]
. я могу получить доступ к элементу индекса I, J многими способами, например:Доступ по указателю на многомерные статические массивы в C/C++
int T[10][10];
/*filling array*/
int i=3, j=7;
int x = T[i][j];
//EDIT - old and wrong: int * ptr = T;
int * ptr = &T[0][0];
int y = *(ptr + 10* i + j);
С другой стороны, когда я создаю dynamicaly выделенный 2-мерный массив сам:
int ** T;
T = malloc(10 * sizeof(int *));
for(i = 0; i < N; i++)
T[i] = malloc(10 * sizeof(int));
Мой массив содержит указатели на
очевидно, что я могу получить доступ к элементу этого массива с помощью:
int i=3, j=7;
int x = *(*(T+i)+j);
И теперь мой вопрос: почему и как он работает для статических массивов? Почему
int T[10][10];
/*filling array*/
int i=3, j=7;
int x = *(*(T+i)+j);
возвратных хорошее значение x
, когда эта таблица не содержит указатели на массивы? *(*(T+i))
не должен иметь смысла там, на мой взгляд, конец, даже если он должен вернуть T[0][i]
, так как T указывает на первый элемент массива. Как компилятор интерпретирует это, *
что-то другое, кроме разыменования здесь? Просветите меня.
1) C не C++ не C. Это не компилируется как C++. 2) Ваше предпосылка неверно: 'int **' is ** not ** 2D-массив и не может указывать на один или не представлять его. 3) Выделите 2D-массив. Почему вы думаете, что то, что вы пытаетесь использовать для статического массива, также не верно для динамически распределенного 2D-массива? – Olaf
попытка получить доступ к 2D-массиву через указатели - плохая идея. 2D-массивы хранятся по-разному на разных машинах. –
@MarkYisri: Err no! Запись 'T [i] [j]' и '* (* (T + i) + j)' абсолютно идентична (по определению оператора '[]'). –