【发布时间】:2020-06-05 21:29:57
【问题描述】:
我有以下代码,它使用所示的两种方法适用于二维数组。它也适用于 3 维数组,只有一种方法。
有谁知道基于指针的解决方案(类似于int *p = ((int *) mda1) + (3 * r) + c;)对于 3 维数组会是什么样子?谢谢
#include <stdio.h>
int main(int argc, char *argv[])
{
int mda1[2][3] = {{0, 1, 2}, {3, 4, 5}};
int mda2[][3] = {{0, 1, 2}, {3, 4, 5}};
int mda3[2][2][1] = { {{0}, {1}},
{{2}, {3}} };
for (int r=0; r<2; r++) {
for (int c=0; c<3; c++) {
int *p = ((int *) mda1) + (3 * r) + c;
printf("%d", *p);
}
}
printf("\n");
int (*mda1p)[3] = mda1;
for (int i=0; i<2; ++i) {
for (int j=0; j<3; ++j)
printf("%d", *(*(mda1p + i) + j));
}
printf("\n");
int (*mda3p)[2][1] = mda3;
for (int i=0; i<2; ++i) {
for (int j=0; j<2; ++j) {
for (int k=0; k<1; ++k) {
printf("%d", *(*(*(mda3p + i) + j) + k));
}
}
}
return 0;
}
解决方案:
#define MDA3_X 2
#define MDA3_Y 2
#define MDA3_Z 1
int mda3[MDA3_X][MDA3_Y][MDA3_Z] = { {{0}, {1}},
{{2}, {3}} };
for (int i=0; i<MDA3_X; ++i) {
for (int j=0; j<MDA3_Y; ++j) {
for (int k=0; k<MDA3_Z; ++k) {
printf("%d",
*((int *) mda3 +
MDA3_Y * MDA3_Z * i + MDA3_Z * j + k));
}
}
}
printf("\n");
【问题讨论】:
-
提供的代码有什么问题?
-
最后一个循环为我打印
0123,你期待的是什么? -
我正在寻找使用类似于我为 2D 使用 int *p = ((int *) mda1) + (3 * r) + c; 的方法打印 3D 的解决方案;跨度>
标签: c pointers casting implicit-conversion pointer-arithmetic