二维数组(C)的Pointer算术类型转换

时间:2019-02-20 19:01:23

标签: c arrays casting

当我想使用指针算术手动索引二维数组的特定数组元素时是否需要进行类型转换。这就是我的意思:

float *p;
float balance[5][2]={2.34, 
5.66,7.85,12.56,9.87,76.22,56.55,21.02,66.12,10.001};
p=(float *) balance;   //Do I need this type casting and if so why?    
printf("%.2f",*(p+(3*2)+1));  

1 个答案:

答案 0 :(得分:0)

Balance是一个2D数组,是一个数组数组。它将像任何指向其第一个元素的指针的数组一样衰减...但是该元素仍然是数组而不是浮点数!

这就是为什么需要在此处进行强制转换的原因,但是实际上将指针转换为数组的指针指向其第一个元素的指针并不是真正的明智之举。正确的方法是取消对balance的引用:它将是一个一维数组,它将很好地衰减到指向第一个浮点数的指针:

p = *balance;    // no cast required here

话虽这么说,但从书呆子的角度来看,下一行(*(p+(3*2)+1))将2D 2x5数组别名为大小为10的1D数组。一旦索引为大于此处的行大小。2.当然所有常见的实现都允许它与旧代码兼容,但是您真的应该怀疑为什么需要它,并且如果可以的话,请避免使用它。

正确和一致的方法是:

float (*pp)[2];
float balance[5][2] = { 2.34,
    5.66,7.85,12.56,9.87,76.22,56.55,21.02,66.12,10.001 };
pp = balance;
printf("%.2f\n", pp[3][1]);