C++ 安全地强制转换为未签名字符*

C++ 安全地强制转换为未签名字符*,c++,casting,C++,Casting,如果我需要将某个对象视为无符号字符数组,这是函数的正确方法吗: int main() { int i = 500; f(&i); } void f(void *ptr) { unsigned char *byteptr = static_cast<unsigned char *>(ptr); ... } intmain(){ int i=500; f&i; } 无效f(无效*ptr){ 无符号字符*byteptr=静态_转换(ptr); .

如果我需要将某个对象视为
无符号字符
数组,这是函数的正确方法吗:

int main() {
    int i = 500;
    f(&i);
}

void f(void *ptr) {
    unsigned char *byteptr = static_cast<unsigned char *>(ptr);
    ...
}
intmain(){
int i=500;
f&i;
}
无效f(无效*ptr){
无符号字符*byteptr=静态_转换(ptr);
...
}

如果我没有函数呢?我是否应该使用两个
static\u cast
,首先是
void*
,然后是
unsigned char*

要将指向
int
变量的指针转换为不相关的类型,如
unsigned char
,您需要使用
重新解释\u cast

unsigned char *byteptr = reinterpret_cast<unsigned char *>(&i);
unsigned char*byteptr=reinterpret\u cast(&i);

但我回应了评论家的问题:你到底想做什么?像这样把
int*
转换成
unsigned char*
似乎不太可能有什么有用的东西。

你到底想做什么?那应该是我的新名字。“评论者”:DC++对象由字节组成,可以通过字符类型访问字节。您可以复制这些字节,有时甚至可以将它们复制回原始对象。这是标准明确允许的。@n.m:明确允许吗?请给我一章一节。@LightnessRacesinOrbit:3.9。2@potrzebie不,不是。标准明确允许在
(无符号)char*
和原始对象类型之间重新解释\u cast。相比之下,我实际上不确定您的原始代码是否是–据我所知,您可能只能在
void*
和原始类型之间进行转换,因此您的代码违反了严格的别名规则。