c++高级---关于C++指针大小和Void*使用的总结

本文探讨了C++中指针的大小一致性,尤其是在32位和64位系统上的表现。尽管不同类型的函数指针大小可能不同,但普通变量指针在同一编译器下具有恒定大小。Void*作为库函数参数的常见用途在于其无视指针类型,如memset函数,强调位置而非类型。此外,文章强调了正确使用Void*的重要性,以遵循接口规范并避免不可预测的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、指针大小问题:【这条内容我还不确定是否准确,网上说法纷纭,但对于现代的编译器来说我更相信是准确的】

C++中任何指针的大小在同一编译器下一定是相同的,一般为32位即4个字节,但对于64位机子也可能是64位,但同一编译器下,各种类型的指针要么同位32位要么同为64位。正因为如此,所以很多C++库函数都使用Void*作为形参且可以保证跨平台(不会出现实参作为一种具体指针类型转换为形参Void*是出现数据截断现象)。

另外,有时常常听说C++中普通函数、成员函数、虚函数等的不同类型的函数指针大小不同,也是对的,但实际上C++中函数指针并不算真正的指针,只不过挂了指针的名字而已,所以并不和上面冲突,讨论C++中任何类型的指针大小时并不包含函数指针。

举个例子:

一下c++标准,里面提到了:把任何一个类型的指针先转换成void*类型,然后在转换回来,原指针的值不改变。即:
也就是如果T *p=100;那么 static_cast<T*>(static_cast<void*>(p)) == 100一定成立。

 

二、Void*作为形参的理解:【这条内容是准确的】

以库函数memset来说吧,第一,形参是void*,它表示memset不关心传入指针的类型,因为memset本身就设计为字节操作的,指针类型对于memset是多余的东西,memset关心的是使用者要给我一个位置,当然这个位置还包括后面n个字节;第二,形参不指向const类型,表示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值