指针可以有值吗? 所以在哪种情况下使用它
int num=100;
int* iptr=NULL;
iptr=reinterpret_cast<int*>(num);
printf("%d n",num);
printf("%d n",num);
结果 100 100
- 指针和整数之间的映射是实现定义的。
- 除非在某些情况下,否则使用
reinterpret_cast
将整数转换为指针将不是安全派生的指针值。在您的示例中不满足这些条件。
引用自CPP草案(N4713(:
8.5.1.10 重新诠释演员表
6. 整型或枚举类型的值可以显式转换为指针。转换为足够大小的整数(如果实现中存在任何此类整数(并返回到相同指针类型的指针将具有其原始值;指针和整数之间的映射由实现定义。[ 注: 除6.6.4.4.3中所述外,这种转换的结果将不是安全派生的指针值。 —尾注 ]
安全派生指针的条件。
6.6.4.4.3 安全派生的指针
...2 仅当指针值
具有对象指针类型并且是以下类型之一时,指针值才是指向动态对象的安全派生指针:
(2.1( — 调用 C++ 个标准库实现 ::运算符 new(std::size_t( 或 ::运算符 new(std::size_t, std::align_val_t( 返回的值;
(2.2( — 获取由左值指定的对象(或其子对象之一(的地址的结果,该地址是通过安全派生的指针值进行间接寻址而产生的;
(2.3( — 使用安全派生的指针值进行明确定义的指针算法的结果;
(2.4( — 安全派生的指针值的明确定义的指针转换的结果;
(2.5( — 安全派生的指针值reinterpret_cast的结果;
(2.6( — 安全派生指针值的整数表示形式的reinterpret_cast的结果;
(2.7( — 其值是从可跟踪指针对象复制的对象的值,在复制时,源对象包含安全派生的指针值的副本。