指针转换:指针可以有价值吗?

时间:2018-10-08 11:24:30

标签: c++ pointers data-structures pointer-conversion

指针可以有价值吗? 所以在哪种情况下使用

int num=100;
int* iptr=NULL;
iptr=reinterpret_cast<int*>(num);
printf("%d \n",num);
printf("%d \n",num);

结果 100 100

1 个答案:

答案 0 :(得分:1)

  1. 指针和整数之间的映射是实现定义的。
  2. 使用reinterpret_cast将整数转换为指针将不是安全导出的指针值,除非在某些情况下。您的示例不满足这些条件。

CPP草案(N4713)的引用:

  

8.5.1.10重新解释演员表
  ...
  6.整数类型或枚举类型的值可以显式转换为指针。指针将转换为足够大的整数(如果实现中存在这样的大小)并返回相同的指针类型,则指针将具有其原始值;指针和整数之间的映射是实现定义的。 [ 注意:   除6.6.4.4.3中所述外,这样的转换结果将不是安全得出的指针值。   —尾注]

安全派生指针的条件。

  

6.6.4.4.3安全衍生的指针
  ...
  2指针值只有在具有对象指针类型并且是以下之一时,才是安全地指向动态对象的指针:
  (2.1)—调用:: operator new(std :: size_t)或:: operator new(std :: size_t,std :: align_val_t)的C ++标准库实现的返回值;
  (2.2)—取由左值指定的对象(或其子对象之一)的地址的结果,该左值是通过安全派生的指针值进行间接寻址而产生的;
  (2.3)—使用安全得出的指针值进行的明确定义的指针算法的结果;
  (2.4)—对安全派生的指针值进行明确定义的指针转换的结果;
  (2.5)—对安全派生的指针值进行reinterpret_cast的结果;
  (2.6)—对安全派生的指针值的整数表示形式的reinterpret_cast的结果;
  (2.7)—一个对象的值,其值是从可追溯的指针对象复制而来的,其中在复制时,源对象包含一个安全派生的指针值的副本。

相关问题