C 如何手动计算给定多维数组索引的索引偏移量?

C 如何手动计算给定多维数组索引的索引偏移量?,c,multidimensional-array,C,Multidimensional Array,我的老师给了我以下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; } #包括 int main(){ int数组[2][2][3]={0,1,2,3,4,5,6,7,8,9,10,11}; printf(“%d”,数组[1][0][2]); 返回0;

我的老师给了我以下
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;
}
#包括
int main(){
int数组[2][2][3]={0,1,2,3,4,5,6,7,8,9,10,11};
printf(“%d”,数组[1][0][2]);
返回0;
}
还有一个问题:哪一个数字会被打印出来? 可能的答案:

  • 四,
  • 五,
  • 六,
  • 七,
  • 八,
8似乎是正确答案,但我不理解老师的解释:

数组[1][0][2]表示:1*(2*3)+0*(3)+3=9-数组中从零开始的第9个元素,即8


C中的数组只是表示内存的一种方式

您的数组包含2、2和3个值,这意味着:

2个“最大”元素包含2个“大”元素,每个元素包含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],实际上是打印数组中的第9个元素,该元素赋值为8。

C中的数组只是表示内存的一种方式

您的数组包含2、2和3个值,这意味着:

2个“最大”元素包含2个“大”元素,每个元素包含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],实际上是在打印数组中的第9个元素,该元素的赋值为8。

此语句:

数组[1][0][2]表示1*(2*3)+0*(3)+3=从零开始的数组的第9个元素,即8

是错误的,因为[1][0][2]处的元素不是从零开始的第9个元素,而是从零开始的第8个元素,同时也是从1开始的第9个元素

因此,正确的陈述应该是:

数组[1][0][2]表示1*(2*3)+0*(3)+2=从零开始的数组的第八个元素

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

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

此语句:

数组[1][0][2]表示1*(2*3)+0*(3)+3=从零开始的数组的第9个元素,即8

是错误的,因为[1][0][2]处的元素不是从零开始的第9个元素,而是从零开始的第8个元素,同时也是从1开始的第9个元素

因此,正确的陈述应该是:

数组[1][0][2]表示1*(2*3)+0*(3)+2=从零开始的数组的第八个元素

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


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

以下是数学运算,输出显示了维度如何给出结果: 第一个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;
}

以下是数学结果,输出显示维度如何给出结果: 第一个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;
}

你的数学老师应该先简单一点解释。对于一维阵列

int 1d_arr[] = {1,2,3,4,5};  
1d_arr[2]
相当于
*(1d_arr+2)
,即获取数组
1d_arr
的元素,该元素是
2*sizeof(1d_arr[2])
=
8
字节,远离基址或
8/4
th=2个元素,即
3
。请注意,基址是
1d_arr
本身(数组到指针的转换)

用于二维阵列

int 2d_arr[2][3] = { {0,1,2}
                     {3,4,5}
                   };
2d\u-arr[0][2]
相当于
*(*(2d\u-arr+0)+2)
,即获取数组
2d\u-arr
的元素,该元素是
0*sizeof(2d\u-arr[0])+2*sizeof(2d\u-arr[0][2])
=
8
远离基址的字节或
0/4+8/4
th=2d arr-code>[0,2]的第二个元素,这是
2

用于三维阵列

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)+40*(3*4)+2*4
=
32
远离基址的字节或
24/4+0/4+8/4
=
6+0+2
=数组的第0个元素(数组)的第2个元素
3d\u arr[1]

你的数学老师应该先简单一点解释。对于一维阵列

int 1d_arr[] = {1,2,3,4,5};  
1d_arr[2]
相当于
*(1d_arr+2)
,即获取数组
1d_arr
的元素,该元素是
2*sizeof(1d_arr[2])
=
8
字节,远离基址或
8/4
th=2个元素,即
3
。请注意,基址是
1d_arr
本身(数组到指针的转换)

用于二维阵列

int 2d_arr[2][3] = { {0,1,2}
                     {3,4,5}
                   };
2d\u-arr[0][2]
相当于
*(*(2d\u-arr+0)+2)
,即获取数组
2d\u-arr
的元素,该元素是
0*sizeof(2d\u-arr[0])+2*sizeof(2d\u-arr[0][2])
=
8
远离基址的字节或
0/4+8/4
th=2d arr-code>[0,2]的第二个元素,这是
2

用于三维阵列

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)+40*(3*4)+2*4
=
32
远离基址的字节或
24/4+0/4+8/4
=
6+0+2
=数组的第0个元素(数组)的第2个元素
3d\u arr[1]

int数组[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)
数组的索引视图


int数组[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)
数组的索引视图

从零开始的数组第9个元素显然是错误的。这道题很简单,老师说