char指针解引用后强制转换为void*通过cout输出结果异常问题问询
问题产生原因
*s的本质是char类型的单个字符,对应你代码里的首字符H,它的底层存储是ASCII码0x48,属于1字节长度的整数类型。- 你写的
(void*)(*s)是把1字节的char值直接强制转换为void*指针类型,64位环境下void*长度为8字节,二者长度不匹配,因此触发了cast to pointer from integer of different size的编译警告。 cout在接收void*类型参数时,默认会输出指针对应的内存地址值,因此会把你强转来的0x48当做地址值输出,得到了你看到的不符合预期的0x48结果。- 补充说明你已有的正确写法对应的行为:
- 直接输出
char*类型的s时,cout会将其识别为C风格字符串,输出到\0截止,因此得到完整的Hello World! - 输出
(void*)s是将整个char指针强转为void*,没有问题,因此能正确输出指针本身的内存地址 - 输出
*s是直接解引用取首字符,因此输出H
- 直接输出
正确实现写法
根据你实际要输出的内容选择对应写法即可:
- 输出char指针本身的内存地址(无警告,C++规范写法)
cout << "casted for address: " << static_cast<void*>(s) << endl;
注:C++更推荐用static_cast代替C风格的强制转换,类型检查更严格,可避免写错转换对象
- 输出char指针指向的首字符的ASCII码数值
// 输出十进制ASCII码 72 cout << "ASCII of first char: " << static_cast<int>(*s) << endl; // 输出十六进制ASCII码 48 cout << "Hex ASCII of first char: " << hex << static_cast<int>(*s) << dec << endl;
内容的提问来源于stack exchange,提问作者pascal111
相关产品推荐
相关产品推荐

