声明指向3 x 3数组并使用指针打印它的指针

时间:2015-05-23 16:42:05

标签: c arrays pointers multidimensional-array compiler-errors

如何声明指向3乘3的数组并使用该指针打印它....编译器给出错误“[错误]下标值既不是数组也不是指针也不是矢量”

#include <stdio.h>
int main(void)
{
    int A[3][3][3]={0};

    int *ptr=A;
    int i,j,k;
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            for(k=0;k<3;k++)
            {
                printf("%d    ",*ptr[i][j][k] );
            }
            puts("");
        }
    }
    return 0;
}

3 个答案:

答案 0 :(得分:3)

您的代码的问题在于您声明指向int的指针,并向其投射数组。这是不正确的,因为指针有一个隐式“维度”(因此允许单个解除引用),而您的数组有三个维度。

要解决此问题,请将ptr声明为指向3×3数组的指针:

int (*ptr)[3][3]=A;

在这种情况下,您需要在访问数组元素时删除解引用运算符

printf("%d    ", ptr[i][j][k]);

demo 1.

或指向3×3×3阵列的指针

int (*ptr)[3][3][3]=&A;

在这种情况下,您需要在向其应用索引之前取消引用指针:

printf("%d    ", (*ptr)[i][j][k]);

demo 2.

答案 1 :(得分:2)

任何多维数组实际上都是一维数组元素又是数组。

此声明

int A[3][3][3]={0};

可以通过以下方式重写

typedef int T[3][3];

T A[3];

所以你有一个数组为A的数组int[3][3]元素 如果要声明指向数组第一个元素的指针,则必须编写

T *ptr = A;

其中ptr是指向T类型对象的指针。由于Tint[3][3]的别名,因此前面的声明可以重写为

int ( *ptr )[3][3] = A;

在这种情况下,循环看起来像

  for(i=0;i<3;i++)
  {
      for(j=0;j<3;j++)
      {
           for(k=0;k<3;k++)
           {
               printf("%d    ", ptr[i][j][k] );
           }

      puts("");

      }
  }

如果要声明指向整个数组本身的指针,则可以编写

int ( *ptr )[3][3][3] = &A;

并且循环看起来像

  for(i=0;i<3;i++)
  {
      for(j=0;j<3;j++)
      {
           for(k=0;k<3;k++)
           {
               printf("%d    ", ( *ptr )[i][j][k] );
           }

      puts("");

      }
  }

但我确信在你的作业中你需要使用指向数组第一个元素的指针,如我最初所示。

答案 2 :(得分:0)

问题是,如果指针是单个星形指针,则使用索引表示法访问指针值适用于单个索引,如下所示

printf("%d\t", ptr[i + 3 * j + 9 * k]);

三星指针int ***ptr将允许语法ptr[i][j][k],但这是错误的,因为指针指向int指针的指针,这意味着数据被排列与数组int A[3][3][3]的方式不同,数组更像是int *ptr指针,因为整数是有条理地存储的。

int ***方法中,它就像一个指向int指针数组的指针数组。这意味着ptr[i]等同于*(ptr + i),与*((char ***)ptr + sizeof(int **))相同,因为sizeof(int **)不一定与 1 {{ 1}},那么它会使指针增加不同于所需的数量,导致明显的问题,解引用的指针不会指向正确的位置。

你总是可以像其他答案一样声明指向数组的指针,但我会跳过那部分,因为它在其他答案中。

1 这可能是巧合的。