将 void* 以外的指针转换为整数和从整数转换指针

Casting pointers other than void* to and from integers

提问人:ByteEater 提问时间:7/18/2023 更新时间:7/18/2023 访问量:60

问:

根据 cppreference.com 的说法,在支持它的实现中,是一种可以保存指向 的指针的类型。因此,可以将 type 的值转换为 (或 ) 并返回相同的值。但是,指向不同类型的指针不必具有相同的大小。intptr_tvoidvoid*intptr_tuintptr_t

所有指向对象的指针都可以在往返保证下进行转换。但是,似乎没有任何要求实际上至少与指向对象类型的任何指针一样宽。因此,在任何对象类型之间和对象类型之间进行强制转换并期望往返是否安全?还是应该在每个方向上添加一个中间铸件?void*void*intptr_tT*Tvoid*

C++ 指针 强制转换

评论

0赞 ByteEater 7/18/2023
有趣的是,C版本只说“能够容纳指针的整数类型”。因此,与C++不同,指向任何对象类型的指针甚至函数指针似乎都是公平的。
0赞 Some programmer dude 7/18/2023
从该链接引用中关于:“能够保存指向”指针的有符号整数类型“,这意味着它的大小至少与 一样大。intptr_tvoidvoid*
2赞 Some programmer dude 7/18/2023
任何指向对象的指针都可以转换为指向 void 的指针。然后,可以将此指针转换为例如。然后,您可以将其转换回指向 的指针,该指针可以转换回指向原始对象的指针。无法保证按位表示之类的内容,只能保证这些转换是有效的,并且不会丢失原始对象。voidintptr_tvoid
1赞 Some programmer dude 7/18/2023
另请注意,这些转换仅适用于指向对象的指针,而不适用于指向函数的指针。指向函数的指针(根据规范)不能隐式转换为 。IIRC 同样适用于指向成员(静态、非静态、函数或非函数)的指针。void*
1赞 Aconcagua 7/18/2023
但是在 C 中(在 C++ 中不确定),函数指针可以独立于它们所代表的签名相互转换。但它会产生未定义的行为,即通过不兼容的函数指针调用函数。

答: 暂无答案