如何使用指向数组的指针访问3-d数组

时间:2013-10-12 13:44:53

标签: c arrays pointers

我已经声明了一个指向一组3-d数组的指针,我在下面分享过。我在使用指向3-d数组的指针访问3-d数组的元素时遇到了问题。

#include <stdio.h>

void main()
{
   int m,row,col;
   int *ptr,*j;
   int array[2][5][2]={10,20,30,40,50,60,70,80,90,100,18,21,3,4,5,6,7,81,9,11};
   int (*p)[5][2];   //  pointer to an group of 3-d array
   p=array;
   for(m=0;m<2;m++)
   {
      ptr=p+m;
      for(row=0;row<5;row++)
      {
         ptr=ptr+row;
         for(col=0;col<2;col++)
         {
            printf("\n the vale is %d",*(ptr+col));
         }
      }
   }
}

输出:

 the value is 10
 the value is 20
 the value is 20
 the value is 30
 the value is 40
 the value is 50
 the value is 70
 the value is 80
 the value is 18
 the value is 21
 the value is 18
 the value is 21
 the value is 21
 the value is 3
 the value is 4
 the value is 5
 the value is 7
 the value is 81
 the value is -1074542408
 the value is 134513849

我的问题是如何使用指向数组的指针访问三维数组的元素,在我的情况下输出显示我的代码不访问元素90,100,9,11以及如何在上面的代码中访问它谢谢你。

4 个答案:

答案 0 :(得分:8)

虽然可以展平数组并将它们作为一维数组访问,但由于你的原始问题是通过指向内部维度的指针来实现,所以这里有一个答案,它使用{{3}为每个级别提供指针。 }。

#include <stdio.h>

/* 1 */
#define TABLES  2
#define ROWS    5
#define COLS    2

/* 2 */
int main()
{
    /* 3 */
    int array[TABLES][ROWS][COLS] = {
                                        { {10, 20}, {30, 40}, {50, 60}, {70, 80}, {90, 100} },
                                        { {18, 21}, {3, 4}, {5, 6}, {7, 81}, {9, 11} }
                                    };
    /* pointer to the first "table" level - array is 3-d but decays into 2-d giving out int (*)[5][2] */
    /* name your variables meaningully */
    int (*table_ptr)[ROWS][COLS] = array;  /* try to club up declaration with initialization when you can */
    /* 4 */
    size_t i = 0, j = 0, k = 0;
    for (i = 0; i < TABLES; ++i)
    {
        /* pointer to the second row level - *table_ptr is a 2-d array which decays into a 1-d array */
        int (*row_ptr)[COLS] = *table_ptr++;
        for (j = 0; j < ROWS; ++j)
        {
            /* pointer to the third col level - *row_ptr is a 1-d array which decays into a simple pointer */
            int *col_ptr = *row_ptr++;
            for (k = 0; k < COLS; ++k)
            {
                printf("(%lu, %lu, %lu): %u\n", (unsigned long) i, (unsigned long) j, (unsigned long) k, *col_ptr++);  /* dereference, get the value and move the pointer by one unit (int) */
            }         
        }
    }
    return 0;   /* report successful exit status to the platform */
}

内联代码注释详细参考

  1. 优良作法是将尺寸定义在某处并在其他地方使用;在一个地方改变会在所有地方改变它并避免讨厌的错误
  2. array decay behaviour而非无效
  3. main's retrun type is int不要避免内括号
  4. 使用recommended保存尺寸类型
  5. 代码中的问题

    对于行ptr=p+m;,GCC会抛出assignment from incompatible pointer type; reason p的类型为int (*)[5][2],即指向整数数组(大小为2)的数组(大小为5)的指针,它被赋给ptr,它只是一个整数指针。 Intead如果您将其更改为int (*ptr) [5];,然后执行ptr = *(p + m);。这就是我的代码所做的(我将p命名为table_ptr),只是它不使用m,但它直接递增p

    在第三级(最里面的循环)之后,你需要一个整数指针说int *x(在我的代码中这是col_ptr)你要做int *x = *(ptr + m1)。基本上,您需要有三个不同的指针,每个指针用于一个级别:int (*) [5][2]int (*) [2]int *。我将它们命名为table_ptrrow_ptrcol_ptr

答案 1 :(得分:2)

重写下面的代码,只使用指针p打印所有内容。

#include <stdio.h>

void main()
{
   int m,row,col;
   int array[2][5][2]={10,20,30,40,50,60,70,80,90,100,18,21,3,4,5,6,7,81,9,11};
   int (*p)[5][2];   //  pointer to an group of 3-d array
   p=array;
   for(m=0;m<2;m++)
   {
      for(row=0;row<5;row++)
      {         
         for(col=0;col<2;col++)
         {
            printf("\n the vale is %d", *((int*)(p+m) + (row*2) + col));
         }         
      }
   }
}

答案 2 :(得分:1)

您可以通过循环2*5*2 = 20并使用指向数组第一个元素的指针轻松访问所有元素,即array[0][0][0]假设3D数组为1D array of arrays of arrays of int

#include <stdio.h>

void main()
{
   int m; //row,col;
   int *ptr; //,*j;
   int array[2][5][2]={10,20,30,40,50,60,70,80,90,100,18,21,3,4,5,6,7,81,9,11};
   //int (*p)[5][2];   //  pointer to an group of 3-d array
   //p=array;
   ptr = &array[0][0][0];
   for(m=0;m <2;m++)
   {
        for (m = 0; m < 20; m++)
      /* ptr=ptr+m;
      for(row = 0;row < 5;row ++)
      {
         ptr=ptr+row;
         for(col=0;col<2;col++)
         {
            printf("\n the vale is %d",*(ptr+col));
         }
      }*/
      printf("\n the vale is %d", *(ptr++));
   }
} 

我对代码的某些部分进行了评论,并将其保留在修改过的代码中,以便您明确我所做的工作。

答案 3 :(得分:1)

#include<stdio.h>


int main()
{
int array[2][2][2]={1,2,3,4,5,6,7,8};

 int *p;
p=&array[0][0][0];


int i=0,j,k;

 /*Accessing data using pointers*/

     for(i=0;i<2;i++)
        {
          for(j=0;j<2;j++)
            {

              for(k=0;k<2;k++)
               {
               printf("%d\n",*p);
                p++;
               }
            }

         }

  return 0;

}

这是一个示例代码,其中使用指针访问2X2X2数组中的元素。 希望它有所帮助!!!!