代码之家  ›  专栏  ›  技术社区  ›  tauran

简单的c++指针转换

  •  3
  • tauran  · 技术社区  · 15 年前

    有人能给我解释一下吗:

    char* a;
    unsigned char* b;
    
    b = a;
    // error: invalid conversion from ‘char*’ to ‘unsigned char*’
    
    b = static_cast<unsigned char*>(a);
    // error: invalid static_cast from type ‘char*’ to type ‘unsigned char*’
    
    b = static_cast<unsigned char*>(static_cast<void*>(a));
    // everything is fine
    

    第二组和第三组有什么区别?如果3中的方法用于其他(更复杂的)类型,是否存在任何陷阱?

    [编辑] 正如一些人提到的糟糕的设计等等。。。

    这个简单的例子来自一个图像库,它给了我一个指向图像数据的指针 char* . 很明显,图像强度总是正的,所以我需要把它解释为 unsigned char

    7 回复  |  直到 15 年前
        1
  •  6
  •   Klaim    15 年前

    static_cast<void*> 消除类型检查的目的,因为你说现在它指向“一些你不知道类型的东西”。那么 编译器必须信任你 当你说 static_cast<unsigned char*> void* 他会按照你明确的要求去做他的工作 .

    你最好用 reinterpret_cast<> 如果您真的必须在这里使用一个cast(因为这里明显显示了一个设计问题)。

        2
  •  5
  •   sellibitze    15 年前

    您的第三方法是有效的,因为C++允许将空指针转换为 T* static_cast 但出于安全原因,对其他指针类型的限制更大。 char unsigned char 是两种截然不同的类型。这需要一个 reinterpret_cast .

        3
  •  2
  •   Diego Sevilla    15 年前

    static_cast (请注意,您将丢失标志信息)。但是,类型 void* 是特殊的,因为C++不能对它作出任何假设,并且必须依赖编译器告诉它确切的类型(因此第三个CAST作品)。

    至于你的第二个问题,当然在使用上有很多陷阱 无效* 无效*

        4
  •  2
  •   zaynyatyi    15 年前

    只有当其中一个指针为void或者在类的对象之间进行强制转换(其中一个类被另一个类继承)时,指针之间的静态\u强制转换才是正确的。

        5
  •  1
  •   Puppy    15 年前

    2和3的区别在于,在3中,您显式地告诉编译器通过强制转换为void*停止检查您。如果使用3中的方法,几乎任何不是直接基元整型的东西,都将调用未定义的行为。无论如何,你可能会在#3中调用未定义的行为。如果它没有隐式地强制转换,除非你真的知道发生了什么,否则这几乎肯定是个坏主意,如果你将一个void*转换回原来不是它的类型,你会得到未定义的行为。

        6
  •  0
  •   sbi    15 年前

    指针之间的强制转换需要 reinterpret_cast void* :

    从任何指向 是隐式的,因此不需要显式强制转换:

    char* pch;
    void* p = pch;
    

    无效* static_cast :

    unsigned char* pi = static_cast<unsigned char*>(p);
    
        7
  •  0
  •   Stephane Rolland    15 年前

    当心,当你施法作废时,你会丢失任何类型信息。

    你试图做的是不正确的,错误的,容易出错和误导。这就是编译器返回编译错误的原因:-)

    一个简单的例子

    char* pChar = NULL; // you should always initalize your variable when you declare them
    unsigned char* pUnsignedChar = NULL; // you should always initalize your variable when you declare them
    
    char aChar = -128;
    pChar = &aChar;
    pUnsignedChar = static_cast<unsigned char*>(static_cast<void*>(pChar));
    

    那么,尽管如此 pUnsignedChar == pChar 我们没有 *pUnsignedChar == 255 *pChar == -128

    我相信这是一个坏笑话,因此是坏代码。