c - 二维数组的指针算术类型转换(C)
问题描述
当我想使用指针算法手动索引二维数组的特定数组元素时,是否需要进行类型转换。如果是,为什么?这就是我的意思:
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));
解决方案
Balance 是一个二维数组,它是数组的数组。它会像任何数组一样衰减到指向其第一个元素的指针……但该元素仍然是数组而不是浮点数!
这就是为什么您需要在这里进行强制转换的原因,但实际上将指向数组的指针强制转换为指向其第一个元素的指针并不是真正的标准明智之举。正确的方法是取消引用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]);
推荐阅读
- python - 如何改变图像中的噪点颜色?
- java - Gradle 同步失败:找不到 com.android.tools.build:gradle:4.0.1
- python-3.x - 使用shogun在python中实现多任务多核学习
- python - 如何在 Tkinter 中重置/延迟 .after?
- python - 页面加载时仪表板选项卡未展开
- r - R:ggdotplot 问题:如何更改颜色
- reactjs - 在 react 中使用 preventDefault 和自定义钩子
- python - 旋转具有重复索引值的 pandas 数据框
- acumatica - 使用 Acumatica SOAP 创建账单会导致错误“System.ArgumentNullException: Value cannot be null”
- css - 如何在不更改元素结构的情况下从应用于父元素的 svg 过滤器中排除子元素?