C指针三维数组

C指针三维数组,c,arrays,pointers,C,Arrays,Pointers,我已经通读了很多解释指针概念的文章,但是我无法找到为什么我的代码会给我一个“不兼容指针类型”的警告。希望你们能帮助我 int cube[3][2][4] = {{{1,2,3,4}},{{2,3},{4,6,8,10}},{{3,4,5,6},{6,8,10}}}; int x = 1; int y = 1; int z = 1; int *p = &cube[0][0][0]; int (*vptr)[2][4] = cube[x][y]; //This line throws a w

我已经通读了很多解释指针概念的文章,但是我无法找到为什么我的代码会给我一个“不兼容指针类型”的警告。希望你们能帮助我

int cube[3][2][4] = {{{1,2,3,4}},{{2,3},{4,6,8,10}},{{3,4,5,6},{6,8,10}}};
int x = 1;
int y = 1;
int z = 1;
int *p = &cube[0][0][0];
int (*vptr)[2][4] = cube[x][y]; //This line throws a warning, when i compile it.
int (*mptr)[4] = cube[x];
然后我想用指针p、vptr、mptr访问多维数据集[x][y][z]。我试过这个,但不起作用

printf("%d",*(*(*(p+x)+y)+z));
printf("%d",*(vptr+z));
printf("%d",*(*(mptr+y)+z));
我在网上读到,您可以访问如下数组元素:

*(*(array + row) + col)
但是我的代码不起作用。第一个printf抛出一个错误“无效的一元类型参数”,第二个printf无效,但第三个有效。我不明白。如果有人能向我解释这种行为,或者能给我一个解释,我将不胜感激

谢谢你的时间和帮助。
你好,迈克。

第一个printf的问题是,
cube
不是指向int数组的指针数组。在内存中,它是一个整数数组。当您将其转换为int*时,编译器将其解释为int数组,确切地说是1D数组。这就是为什么
*(*(数组+行)+col)
不起作用的原因

第一个printf语句应该是

printf("%d", *(p + x*2*4 + y*4 + z));

您可能的意思是:

#include <stdio.h>

int main(void)
{
    int cube[3][2][4] = {{{1,2,3,4}},{{2,3},{4,6,8,10}},{{3,4,5,6},{6,8,10}}};
    int x = 1;
    int y = 1;
    int z = 1;

    int *p = &cube[0][0][0];
    int (*vptr)[2][4] = cube;
    int (*mptr)[4] = cube[x];

    printf("%d\n", *p);
    printf("%d\n", *(*(*(vptr+x)+y)+z));
    printf("%d\n", *(*(mptr+y)+z));

    return 0;
}
不做你想做的事。
cube[x][y]
的值具有类型
int*
,该类型与声明的
vptr
类型不匹配(指针指向类型
int
的四元素数组中的两元素数组)

要使用
%d
格式说明符和
vptr
打印
int
值,您可以通过以下任一方式进行访问:

vptr[x][y][z]

*(*(*(vptr+x)+y)+z))

查看此链接您的定义
int(*vptr)[2][4]=cube[x][y]没有意义。您正在为某个数组分配一个整数。
int (*vptr)[2][4] = cube[x][y];