代码之家  ›  专栏  ›  技术社区  ›  Jonathan Mee

为什么我要重新解释投射指针?

  •  2
  • Jonathan Mee  · 技术社区  · 6 年前

    所以这个 static_cast

    int n = 13;
    void* pn = static_cast<void*>(&n);
    void** ppn = &pn;
    

    但这必须成为一个 reinterpret_cast

    int n = 13;
    int* foo = &n;
    void** bar = static_cast<void**>(&foo);
    

    错误C2440: 静态浇铸 int ** void ** 重新解释 ,C样式转换或函数样式转换

    所以我认为问题是“类型是不相关的”。但我还是不明白,如果从一个 int* void* int** 和一个 void** ?

    2 回复  |  直到 6 年前
        1
  •  8
  •   eerorika    6 年前

    int 与…毫无关系 void int** void** 所以它们不能用 static_cast .

    void* 特殊的 . 任何数据指针类型(包括 int* )可能是 进入之内 无效* 无效 (更进一步说,转换为 无效* 不需要强制转换,因为它是隐式的)。 没有这个财产,也没有 无效** 除此之外,任何其他指针 无效* .


    无效* 附带附加限制。 无效 由于这些限制,无法存在。

    无效* 对象确实存在,它们需要存在。如果我们不能间接或迭代 无效** ,则无法使用 无效* 例如。

        2
  •  0
  •   curiousguy    6 年前
    void* pn = static_cast<void*>(&n);
    

    是隐式转换;你也可以写

    void *pn = &n;
    

    意思是 pn static_cast :

    int *pi = static_cast<int*>(pn);
    

    静态浇铸 float 明显不同, const int reinterpret_cast 非隐式转换(或 静态浇铸 静态浇铸 .

    void* ,一个追溯到C的概念,其中cast显然是用C样式的cast拼写的(不是 静态浇铸 但在其他方面有相同的含义。

    回到C和C++中声明的语法:

    指向的指针的声明 int int (*pi); (括号是无用的,但有助于说明这一点),你可以这样读:我声明这个表达式 (*pi) 内景 . 可以这样读取函数声明:in int f(int i); i 有类型 内景 f(i) 内景

    宣言 void (*pi); 看起来像是指向 void 但是没有类型的对象 ,表达式 *pi 特殊情况 在类型系统中:语法是“指向void的指针”,语义是“指向某物的指针”。

    在C和C++中,指针对象是第一类对象,可以取其地址并具有指针等指针(与java相比,在引用中,其他基本类型的引用不是类对象)。

    所以你可以有一个 int** , int*** 内景 ); 你也可以因为同样的原因 void** :声明为指向(指向void的指针),语义上是指向(指向某物的指针)。

    内景 无法分配给指向的指针 浮动 没有演员阵容:

    float *f = &i; // ill-formed
    

    由于类型不匹配,类型与 无法分配给 无效** : 无效** 必须是一个 无效* 对象