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;
}
还有一个问题:哪一个数字会被打印出来?
可能的答案:
- 四,
- 五,
- 六,
- 七,
- 八,
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个元素显然是错误的。这道题很简单,老师说