c - 二维数组的指针算术中的类型转换(C)

标签 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));  

最佳答案

Balance 是一个二维数组,它是数组的数组。它会像任何数组一样衰减到指向其第一个元素的指针......但该元素仍然是一个数组而不是 float !

这就是为什么你需要在这里进行强制转换的原因,但实际上将指向数组的指针强制转换为指向其第一个元素的指针并不是真正标准的做法。正确的方法是取消引用 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]);

关于c - 二维数组的指针算术中的类型转换(C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54793505/

相关文章:

c++ - 使用 getch() 进行标准输入时输入 EOF 符号

c - 如何在滚动窗口布局中添加 GtkEventBox?

javascript - 如何从 JS 中的数组中删除一个子集?

c++ - 在 C/C++ 中进行数学运算时,我应该对哪些变量进行类型转换?

c - 无限整数精度

c - 安排代码以分隔 C 中的函数

c# - 在 C# 中的相似类型之间进行转换

ios - 为什么 Swift 需要明确地将 Int 转换为 Float

python - 如何在Python3中沿着第三维堆叠两个以上的numpy图像数组

java - C++/Java - int(0 - 1023) 到字节数组(仅限两个字节)