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



是否有可能让编译器在平面指针上做相同的指针算术,因为它在多维数组上?

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

int main(void)
{
    char ar[2][3][4];
#define At(a,x,y,z) printf("["#x"]["#y"]["#z"]=%ldn", &(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"]=%tdn", &(a)[x][y][z] - &(a)[0][0][0]);

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

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

我想你错过了一个参考。现在你有了一个指向三维数组的指针。

你需要这样做:

At(*p, 0, 0, 1);

相关内容

  • 没有找到相关文章

最新更新