是否有可能让编译器对平面指针执行与多维数组相同的指针算法?
对于多维数组,指针算法似乎如下工作:
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
*/
}
但正如您所看到的,这并没有给出相应的结果。 到底发生了什么?结果可以匹配吗?
答案 0 :(得分:2)
您添加了一个额外的维度,请尝试以下方法:
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]));
答案 1 :(得分:1)
我认为你错过了一个解除引用。你现在有一个指向三维数组的指针。
你需要这样做:
At(*p, 0, 0, 1);