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

C语言中向接收指针的函数传入强转指针的参数的原理是什么?

问题解答

核心原理铺垫

C语言中指针本质是存储内存地址的整数型变量,类型仅用于约束解引用时的内存解释规则和指针运算步长,变量本身的存储空间可以用来存储任意符合长度的数值,不一定非要存合法内存地址。

各疑问对应解释

  • (void*)20的含义

    这是C语言的强制类型转换语法,作用是把整数常量20直接转换为void*类型的指针。这里并没有把20当作内存地址使用,只是借void*类型变量的存储空间直接存入20这个整数值,全程不会用这个指针去访问内存。
  • int n = (int)param的作用

    该语句没有对param做任何解引用操作,只是把void*类型变量param自身存储的整数值(也就是之前传入的20),强制转换回int类型后赋值给n。因为没有访问param指向的内存,所以完全不需要param存储的是合法的内存地址。
  • 为什么print2不需要传入地址

    print1的逻辑是把param当真正的指针使用:传入int变量的地址,再对param解引用读取地址指向的int值,所以必须传合法地址。
    而print2的逻辑完全没有用到指针的寻址功能,只是把void*类型的形参当作普通的整数容器来用,直接把要传递的整数塞进形参的存储空间即可,不需要额外申请变量存值再传地址,所以直接把20强转成void*传入就可以正常运行。

注意事项

这种写法属于C语言的奇技淫巧,存在兼容性风险:如果系统中void*和int的长度不一致(比如64位系统中void*占8字节,int占4字节),强制转换时可能出现数据截断问题,生产环境不推荐这种写法,更稳妥的做法是始终保证void*存储的是合法内存地址。

对应示例代码

#include <stdio.h>
#include <stdlib.h>

void print1(void* param)
{
    int n = *((int*)param);
    printf("You sent: %d\n", n);
}

void print2(void* param)
{
    int n = (int)param;
    printf("You sent: %d\n", n);
}

int main()
{
    int number = 10;
    print1(&number);

    print2((void*)20);

    return 0;
}

内容的提问来源于stack exchange,提问作者ierwrk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:24:05