如何将指向char的指针强制转换为指向int的指针

mai*_*mai 2 c++ pointers casting

我想将一个指向pcchar 的指针转换为指向piint的点

char *pc;
int *pi;
pi = (int*)pc                                    // compiler complaint about old-style cast
pi = static_cast<int *>(static_cast<void *>(pc)) // no complaint any more but too complex
Run Code Online (Sandbox Code Playgroud)

是否有任何更简单的方法来执行此演员并使编译器保持沉默?

Sea*_*ean 7

如果你真的需要这样做,那么reinterpret_cast就是你的朋友:

char *pc = 0;
int *pi = 0;

pi = reinterpret_cast<int*>(pc);
Run Code Online (Sandbox Code Playgroud)

  • 前7个字是最重要的. (5认同)

Bat*_*eba 6

通常,转换char*指针的行为int*未定义的.取消引用这样的指针将导致您进一步麻烦,因为您将破坏严格的别名规则.请注意,C++标准不需要sizeof(char*)sizeof(int*).

(请注意,转换unsigned char*指针到一个int*是良好定义的,如果unsigned char*指针实际上指向一个int).

不要这样做.永远.

  • 除非`char*`已经指向`int` ....合法的别名 (7认同)
  • 指针转换从不违反严格的别名规则.该规则是关于通过不同类型的左值访问一种类型的对象. (4认同)
  • 这个演员也不是未定义的.在最坏的情况下,如果对齐不正确,则结果未指定. (3认同)
  • `&s + 2`是UB,用于在任何对象的边界之外形成指针.但是如果源指针指向一个对象,那么转换它的结果仍然指向同一个存储(如果未对齐则未指定) (3认同)
  • 指针大小必须使得可以实现标准所需的行为.该标准明确允许在指向不同对象类型的指针之间进行转换. (3认同)
  • @Bathsheba - 访问内存是一回事(我更喜欢`unsigned char`是安全的).但只是获得一个指针和退回似乎是合法的. (2认同)
  • 我不否认在表中填充具有不确定值的整数的可能性.但是你说指针转换本身是未定义的行为是非常错误的. (2认同)
  • 任何字符类型都可以,签名无符号或普通. (2认同)