-3

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

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

结果 100 100

4

1 回答 1

1
  1. 指针和整数之间的映射是实现定义的。
  2. 将整数转换为指针 usingreinterpret_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) — 一个对象的值,其值是从一个可跟踪的指针对象复制而来的,在复制时,源对象包含一个安全派生的指针值的副本。

于 2018-10-08T12:01:21.727 回答