如何声明指向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;
}
答案 0 :(得分:3)
您的代码的问题在于您声明指向int
的指针,并向其投射数组。这是不正确的,因为指针有一个隐式“维度”(因此允许单个解除引用),而您的数组有三个维度。
要解决此问题,请将ptr
声明为指向3×3数组的指针:
int (*ptr)[3][3]=A;
在这种情况下,您需要在访问数组元素时删除解引用运算符
printf("%d ", ptr[i][j][k]);
或指向3×3×3阵列的指针
int (*ptr)[3][3][3]=&A;
在这种情况下,您需要在向其应用索引之前取消引用指针:
printf("%d ", (*ptr)[i][j][k]);
答案 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
类型对象的指针。由于T
是int[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 这可能是巧合的。