2017-02-19 119 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 - 阵列从零开始的第九元件,即 。

+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] 

当你初始化数组,它会为了assing为了匹配元素的值:0,1,2,3,4,5,6, 7,8,9,10,11

如果要打印阵列[1] [0] [2]时,实际上是在印刷阵列第九元件,已分配的值8.

1

此语句:

array [1] [0] [2]表示1 *(2 * 3)+ 0 *(3)+ 3 =从零开始的第9个元素的元素,也就是8.

是错误的, 1] [0] [2]不是从零开始的第9个元素,但实际上是从零开始的第8个元素,并且同时从第1个元素开始1.

因此正确的语句可以是:

array [1] [0] [2]表示1 *(2 * 3)+ 0 *(3)+ 2 =从零开始的第8个元素。

或(添加1到表格索引转换为编号):

阵列[1] [0] [2]表示1 *(2 * 3)+ 0 *(3)+2+ 1 =从1开始的第9个元素。

1

这里是算术和输出显示尺寸如何得到的结果: 第一个1秒0三2货号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 IRST。对于一维数组

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_arr0*sizeof(2d_arr[0]) + 2*sizeof(2d_arr[0][2]) = 8字节远离基地址或0/4 + 8/4个的元件 = 2 ND的元件阵列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 array(阵列)的阵列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...