2017-02-19 13 views
1

Мой учитель дал мне следующий пример: CКак я могу вычислить смещение индекса из заданного индекса многомерного массива вручную?

#include<stdio.h> 

int main(){ 
     int array[2][2][3]={0,1,2,3,4,5,6,7,8,9,10,11}; 
     printf("%d",array[1][0][2]); 
     return 0; 
} 

наряду с вопросом: Какой номер будет распечатан? Возможные ответы:

, кажется, правильный ответ, но я не понимаю объяснение от моего учителя:

массив [1] [0] [2] означает: 1 * (2 * 3) + 0 * (3) + 3 = 9 - 9-й элемент массива, начиная с нуля, т.е. ,

+1

* девятый элемент массива, начиная с нуля *, очевидно, неправильно. Проблема настолько проста, что учитель, допустивший ошибку, должен быть вызван на него. – 2501

ответ

1

Массивы в C - это всего лишь способ представления памяти.

У вас есть массив со значениями 2, 2 и 3, что означает:

2 "большие" элементы, содержащие 2 "большие" элементы cantaining 3 элемента каждый.

В памяти она выглядит следующим образом:

1st element in array: array[0][0][0] 
2nd element in array: array[0][0][1] 
3rd element in array: array[0][0][2] 
4th element in array: array[0][1][0] 
5th element in array: array[0][1][1] 
6th element in array: array[0][1][2] 
7th element in array: array[1][0][0] 
8th element in array: array[1][0][1] 
9th element in array: array[1][0][2] 
10th element in array: array[1][1][0] 
11th element in array: array[1][1][1] 
12th element in array: array[1][1][2] 

При инициализации массива, он будет Ассингом ваших значений в согласующем порядке элементов в порядке: 0,1,2,3,4,5,6, 7,8,9,10,11

Если вы хотите напечатать массив [1] [0] [2], вы на самом деле печать девятый элемент в массиве, который присваивается значение 8.

1

Это утверждение :

[1] [0] [2] означает 1 * (2 * 3) + 0 * (3) + 3 = 9-й элемент массива, начиная с нуля, т.е. 8.

неверен, поскольку элемент в [ 1] [0] [2] не является девятым элементом, начинающимся с нуля, но на самом деле является восьмым элементом, начинающимся с нуля, и в то же время 9-й элемент, начиная с 1.

Поэтому правильное утверждение должно либо:

массив [1] [0] [2] означает 1 * (2 * 3) + 0 * (3) + 2 = 8-й элемент массива, начиная с нуля.

или (добавление +1 для преобразования формы индексации нумерации):

массив [1] [0] [2] означает 1 * (2 * 3) + 0 * (3) +2+ 1 = 9-й элемент массива, начиная с одного.

1

Вот математика и вывод показывает, как размеры приведены результаты: Первого 1 Второго 0 Третьего 2 Num 8

Number[FirstDim][SecondDim][ThirdDim] = FirstDim *(Length of Second Dim -1) * (Length of third dim -1) + 
SecondDim *(Length of third dim -1) + ThirdDim 

Вот формула:

#include<stdio.h> 
#define FIRST 2 
#define SECOND 2 
#define THIRD 3 
int main(){ 
    int i, j ,k; 
    int array[FIRST][SECOND][THIRD]={0,1,2,3,4,5,6,7,8,9,10,11}; 
    for (i = 0 ; i < FIRST; i++) { 
     for (j = 0 ; j < SECOND; j++) { 
      for (k = 0 ; k < THIRD; k++) { 
       printf("First %d Second %d Third %d Num %d", i, j, k, array[i][j][k]); 
       printf("\n"); 
      } 
      printf("First %d Second %d Third %d \n", i, j, k); 
     } 
     printf("First %d Second %d Third %d \n", i, j, k); 
    } 
    printf("%d",array[1][0][2]); 

    return 0; 
} 

Результат:

First 0 Second 0 Third 0 Num 0 
First 0 Second 0 Third 1 Num 1 
First 0 Second 0 Third 2 Num 2 

First 0 Second 1 Third 0 Num 3 
First 0 Second 1 Third 1 Num 4 
First 0 Second 1 Third 2 Num 5 

First 1 Second 0 Third 0 Num 6 
First 1 Second 0 Third 1 Num 7 
First 1 Second 0 Third 2 Num 8 

First 1 Second 1 Third 0 Num 9 
First 1 Second 1 Third 1 Num 10 
First 1 Second 1 Third 2 Num 11 
3

Ваш учитель по математике должен объяснить немного легче f рвые. Для 1D массива

int 1d_arr[] = {1,2,3,4,5}; 

1d_arr[2] эквивалентны *(1d_arr + 2), то есть получить элемент массива 1d_arr который является 2 * sizeof(1d_arr[2]) = 8 байт далеки от базового адреса или 8/4я = 2 я элемента, который является 3. Обратите внимание, что базовый адрес равен 1d_arr (преобразование массива в указатель).

Для 2D массива

int 2d_arr[2][3] = { {0,1,2} 
        {3,4,5} 
        }; 

2d_arr[0][2] эквивалентен *(*(2d_arr + 0) + 2), т.е. получить элемент массива 2d_arr, который 0*sizeof(2d_arr[0]) + 2*sizeof(2d_arr[0][2]) = 8 байт далеки от базового адреса или 0/4 + 8/4го = 2 я элемента массив 2d_arr[0], который является 2.

для 3d массива

int 3d_arr[2][2][3] = { {0,1,2}, {3,4,5} 
         {6,7,8}, {9,10,11} 
         }; 

3d_arr[1][0][2] эквивалентен *(*(*(3d_arr + 1) + 0) + 2), т.е. получить элемент массива 3d_arr, который 1*sizeof(3d_arr[1]) + 0*sizeof(3d_arr[1][0]) + 2*sizeof(3d_arr[1][0][2]) = 1*(2*3*4) + 0*(3*4) + 2*4 = 32 байт далек от базового адреса или 24/4 + 0/4 + 8/4 = 6 + 0 + 2 = 2 я элемента 0 th элемент (массив) массива 3d_arr[1].

+0

Помощник Downvoter, чтобы объяснить? – haccks

0

int array [2] [2] [3] = {0,1,2,3,4,5,6,7,8,9,10,11};

Consider 3D Array as an "array of 2D Array",like there are 2 * (2 X 3 array) 

Индекс Вид массива

0 -> 0 1 2 
     3 4 5 

1 -> 6 7 8 
     9 10 11 

Real Value in indexes are : 

as per indexing table 
first value will fall in 1 array of 2D array 
(in first row and first column array[0][0][0]) 

and second in 1 array of 2D array 
(in first row and second column array[0][0][1]) and so on...