【问题标题】:Pointer casting:can the Pointer has value?指针转换:指针是否有价值?
【发布时间】:2018-10-08 11:24:30
【问题描述】:

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

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

结果 100 100

【问题讨论】:

  • iptr=reinterpret_cast&lt;int*&gt;(num); 没有 C 意义; C 标记已删除。
  • 请澄清问题。指针有值是什么意思?而且您的代码两次打印同一个变量,所以结果显然是 100 100。这里没有以任何方式使用指针。
  • 完全不清楚问题是什么。您的代码的基本作用是:它将 100 分配给 num,然后将值打印两次。不需要指针来理解发生了什么,但打赌你担心中间的那两条线(目前对你的代码输出的影响为零)
  • 指针的值就是它所指向的地址。
  • 不确定我是否理解这个问题。你是在问一个整数什么时候代表一个有效的地址?

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


【解决方案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) — 一个对象的值,其值是从一个可跟踪的指针对象复制而来的,在复制时,源对象包含一个安全派生的指针值的副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    相关资源
    最近更新 更多