C语言中向接收指针的函数传入强转指针的参数的原理是什么?
问题解答
核心原理铺垫
C语言中指针本质是存储内存地址的整数型变量,类型仅用于约束解引用时的内存解释规则和指针运算步长,变量本身的存储空间可以用来存储任意符合长度的数值,不一定非要存合法内存地址。
各疑问对应解释
这是C语言的强制类型转换语法,作用是把整数常量20直接转换为(void*)20的含义void*类型的指针。这里并没有把20当作内存地址使用,只是借void*类型变量的存储空间直接存入20这个整数值,全程不会用这个指针去访问内存。
该语句没有对param做任何解引用操作,只是把int n = (int)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
相关产品推荐
相关产品推荐

