C:用指针访问多维数组
C: accessing multidimensional arrays with pointers
我有以下代码,它使用所示的两种方法适用于二维数组。它也适用于 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");
如果我没理解错的话,你正试图写类似
的东西
int *p = ( int * )mda3;
printf( "%d", *( p + 2 * 1 * i + 1 * j + k ) );
如果你有一个声明为
的三维数组,这通常是这样的
int a[N1][N2][N3];
然后使用 int * 类型的指针你可以这样写
int *p = ( int * )a;
//...
printf( "%d", *( p + N2 * N3 * i + N3 * j + k ) );
这是一个演示程序。
#include <stdio.h>
int main(void)
{
enum { N1 = 2, N2 = 3, N3 = 4 };
int a[N1][N2][N3] =
{
{
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 10, 11, 12, 13 }
},
{
{ 21, 22, 23, 24 },
{ 25, 26, 27, 28 },
{ 30, 31, 32, 33 }
}
};
int *p = ( int * )a;
puts( "a =" );
printf( "{\n" );
for ( size_t i = 0; i < N1; i++ )
{
printf( "\t{\n" );
for ( size_t j = 0; j < N2; j++ )
{
printf( "\t\t{" );
for ( size_t k = 0; k < N3; k++)
{
printf( "%2d ", *( p + N2 * N3 *i + N3 * j + k ) );
}
printf( "}\n" );
}
printf( "\t}\n" );
}
printf( "}\n" );
return 0;
}
它的输出是
a =
{
{
{ 1 2 3 4 }
{ 5 6 7 8 }
{10 11 12 13 }
}
{
{21 22 23 24 }
{25 26 27 28 }
{30 31 32 33 }
}
}
我有以下代码,它使用所示的两种方法适用于二维数组。它也适用于 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");
如果我没理解错的话,你正试图写类似
的东西int *p = ( int * )mda3;
printf( "%d", *( p + 2 * 1 * i + 1 * j + k ) );
如果你有一个声明为
的三维数组,这通常是这样的int a[N1][N2][N3];
然后使用 int * 类型的指针你可以这样写
int *p = ( int * )a;
//...
printf( "%d", *( p + N2 * N3 * i + N3 * j + k ) );
这是一个演示程序。
#include <stdio.h>
int main(void)
{
enum { N1 = 2, N2 = 3, N3 = 4 };
int a[N1][N2][N3] =
{
{
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 10, 11, 12, 13 }
},
{
{ 21, 22, 23, 24 },
{ 25, 26, 27, 28 },
{ 30, 31, 32, 33 }
}
};
int *p = ( int * )a;
puts( "a =" );
printf( "{\n" );
for ( size_t i = 0; i < N1; i++ )
{
printf( "\t{\n" );
for ( size_t j = 0; j < N2; j++ )
{
printf( "\t\t{" );
for ( size_t k = 0; k < N3; k++)
{
printf( "%2d ", *( p + N2 * N3 *i + N3 * j + k ) );
}
printf( "}\n" );
}
printf( "\t}\n" );
}
printf( "}\n" );
return 0;
}
它的输出是
a =
{
{
{ 1 2 3 4 }
{ 5 6 7 8 }
{10 11 12 13 }
}
{
{21 22 23 24 }
{25 26 27 28 }
{30 31 32 33 }
}
}