C语言指针的函数与数据类型:平均值计算结果异常问题
问题解决方法
问题根源
原代码中,*result是int类型,将计算出的浮点平均值(79.6)赋值给它时,会自动截断小数部分,仅保留整数79。后续将int类型的result转为float时,只能得到79.0,无法保留小数。且任务限制不能修改int result = 0和int *result的定义,因此不能直接修改变量类型。
解决方案
通过指针类型强制转换,绕过int类型的限制,将浮点值直接写入result的内存空间,读取时按浮点类型解析,实现保留小数的输出。
修改后的完整代码
#include <stdio.h> void call_value(int A[], int result) { int i; int sum = 0; for(i = 0; i < 5; i++) { sum += A[i]; } result = sum / 5; } void call_address(int A[], int *result) { int i; double sum_address = 0; for(i = 0; i < 5; i++) { sum_address += A[i]; } // 强制将int指针转为float指针,赋值浮点平均值 *(float*)result = sum_address / 5; } int main() { int result = 0; int A[5] = {95, 88, 76, 54, 85}; call_value(A,result); printf("[Call by value] result = %d\n",result); call_address(A,&result); // 将int变量的地址转为float指针,读取浮点值 printf("[Call by address] result = %.1f\n", *(float*)&result); }
原理说明
(float*)result:将int类型的指针强制转换为float类型指针,此时对其解引用赋值,会把浮点值直接写入result变量的内存空间(需保证int和float的内存长度一致,多数系统中均为4字节,可正常运行)。*(float*)&result:读取时,将int变量result的地址强制转为float指针,解引用后即可获取之前存入的完整浮点值79.6,实现正确输出。
内容的提问来源于stack exchange,提问作者mouin
相关产品推荐
相关产品推荐

