You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:35:33