2014-02-19 2 views
1

Я знаю, об этом много говорили, но я не мог найти явной ссылки на то, что мне нужно.Доступ к многомерному массиву через указатель

Мне нужно иметь элемент структуры, который укажет на двумерный массив. Размер массива не фиксирован, каждый экземпляр структуры укажет на массив с другим размером.

Я думал о следующим образом:

struct towDimByPtr 
{ 
    int NumRow; 
    int NumCol; 
    int* ptr2TwoDim; 
}; 

Тогда я буду иметь глобалам:

int arr1[30][90]; 
int arr2[20][10]; 

towDimByPtr towDim1; 
towDimByPtr towDim2; 

В INIT я сделаю:

towDim1.ptr2TwoDim = arr1; 
towDim1.NumRow = 30; 
towDim1.NumCol = 90; 
towDim2.ptr2TwoDim = arr2; 
towDim2.NumRow = 20; 
towDim2.NumCol = 10; 

Наконец при доступе к элемент Я буду использовать:

towDim1[curr_row*NumCol + curr_col] 

Мой вопрос: будет ли это всегда работать.

+0

C и C++ - это языки [row-major order] (http://en.wikipedia.org/wiki/Row_major), поэтому, пока вы держитесь за это, он должен работать. Но я бы не рекомендовал использовать его, поскольку он довольно запутывает. –

+0

@JoachimPileborg, спасибо. Не могли бы вы предоставить ссылку на это? – Subway

ответ

4

Это задание не будет работать:

towDim1.ptr2TwoDim = arr1; 

arr1 распадается на int (*)[90], не int *. Вы должны сделать это задание, используя указатель на первый элемент, как:

towDim1.ptr2TwoDim = &arr1[0][0]; 

Или, что то же самое,

towDim1.ptr2TwoDim = arr1[0]; 

То же самое относится к towDim2.ptr2TwoDim = arr2;.

Кроме того, если вы гарантируете, что curr_row и curr_col не находятся за пределами границ, то да, это всегда будет работать.

+0

Спасибо Filipe. Не могли бы вы предоставить ссылку на то, что многомерные массивы гарантированно будут храниться таким образом? – Subway

+0

@Subway Да, вы можете увидеть его на странице Википедии о C: http://en.wikipedia.org/wiki/C_%28programming_language%29#Arrays Для более формальной ссылки C90, похоже, придерживается этого в разделе F .2.5, «Хранилище массивов» (см. Http://docs.oracle.com/cd/E19205-01/819-5265/bjbdp/index.html). В нем говорится, что «массивы C хранятся в строчном порядке, последний индекс в многомерном массиве отличается самым быстрым». –

+1

@Subway Только что проверили на C99, что это находится в разделе 6.5.2.1, третий абзац: «[...] Из этого следует, что массивы хранятся в строчном порядке (последний индекс меняется быстрее)». –

Смежные вопросы