6

我已经声明了一个指向我在下面共享的一组 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

我的问题是如何使用指向数组的指针访问 3-d 数组的元素,在我的情况下,输出显示我的代码没有访问元素 90,100,9,11 以及如何在上面的代码中访问它。谢谢进步。

4

4 回答 4

11

虽然展平数组并将它们作为一维数组访问是可能的,但由于您最初的问题是使用指向内部维度的指针来执行此操作,因此这里有一个答案,它使用数组衰减行为为您提供每个级别的指针。

#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. main 的返回类型是 int而不是 void
  3. 建议不要避开内牙套
  4. 用于size_t保存尺寸类型

代码中的问题

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

在第三级(最内层循环)之后,您需要一个整数指针int *x(在我的代码中是col_ptr),您会这样做int *x = *(ptr + m1)。基本上,您需要三个不同的指针,每个指针对应一个级别int (*) [5][2]int (*) [2]int *. 我已经命名了它们table_ptrrow_ptr并且col_ptr

于 2013-10-12T15:10:01.900 回答
3

在下面重写您的代码,并使用指针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));
         }         
      }
   }
}
于 2013-10-12T14:18:23.520 回答
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++));
   }
} 

我注释了您的代码的某些部分并将其留在修改后的代码中,以便您清楚我所做的事情。

于 2013-10-12T13:48:50.537 回答
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 数组中的元素。希望能帮助到你 !!!!

于 2013-10-12T15:18:39.890 回答