将平面指针转换为多维数组

标签 c multidimensional-array

是否可以让编译器对平面指针执行与多维数组相同的指针算术?

对于多维数组,指针算术的工作原理如下:

int main(void)
{
    char ar[2][3][4];
#define At(a,x,y,z) printf("["#x"]["#y"]["#z"]=%ld\n", &(a)[x][y][z] - &(a)[0][0][0]);
    At(ar,0,0,0);
    At(ar,0,0,1);
    At(ar,0,0,2);
    At(ar,0,0,3);
puts("");
    At(ar,0,1,0);
    At(ar,0,2,0);
    At(ar,0,3,0);
puts("");
    At(ar,1,0,0);
    At(ar,2,0,0);
    At(ar,3,0,0);
/*
    [0][0][0]=0
    [0][0][1]=1
    [0][0][2]=2
    [0][0][3]=3

    [0][1][0]=4  // 1 * 4
    [0][2][0]=8  // 2 * 4
    [0][3][0]=12 // 3 * 4

    [1][0][0]=12 // 1 * 3 * 4
    [2][0][0]=24 // 2 * 3 * 4
    [3][0][0]=36 // 3 * 3 * 4 
*/
}

所以我尝试了:

    char *blk;
    if(!(blk=malloc(1000))) return -1;
    char (*p)[2][3][4] = (char(*)[2][3][4])blk;

    At(p,0,0,0);
    At(p,0,0,1);
    At(p,0,0,2);
    At(p,0,0,3);
puts("");
    At(p,0,1,0);
    At(p,0,2,0);
    At(p,0,3,0);
puts("");
    At(p,1,0,0);
    At(p,2,0,0);
    At(p,3,0,0);

/*
    [0][0][0]=0
    [0][0][1]=1
    [0][0][2]=2
    [0][0][3]=3

    [0][1][0]=3
    [0][2][0]=6
    [0][3][0]=9

    [1][0][0]=6
    [2][0][0]=12
    [3][0][0]=18
*/
}

但是正如您所看到的,这并没有给出相应的结果。 这里究竟发生了什么?可以使结果匹配吗?

最佳答案

您添加了额外的维度,请尝试以下操作:

char (*p)[3][4] = (char(*)[3][4])blk;

另请注意,您的 printf 格式不正确:2 个指针的差异为 ptrdiff_t 类型,对应的格式长度修饰符为 t:

#define At(a,x,y,z) printf("["#x"]["#y"]["#z"]=%td\n", &(a)[x][y][z] - &(a)[0][0][0]);

如果您的 C 库不完全兼容 C99,您应该使用强制转换:

#define At(a,x,y,z) printf("["#x"]["#y"]["#z"]=%ld\n", (long)(&(a)[x][y][z] - &(a)[0][0][0]));

关于将平面指针转换为多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40255524/

相关文章:

C++ 为多维数组赋值

java - 为什么我只需要循环23次就可以画出24个矩形?

c - 无法反转链表 - C 语言

c - 将 libsamplerate 与 libsndfile 一起使用

c - 在 C 中强制无序结构字段

php - 如何从复杂的多维数组中获取所有值?

c - (Asterisk PBX) 如何从 features.conf 中的 asterisk agi 控制用 C 编写的程序

c - 如何在 C 中读取文件并将字符存储在变量中

javascript - 如何使用 jquery 或 javascript 对对象数组进行排序

c - 初始化静态多维空终止数组