用“void*”转换“char”指针并取消引用它
Posted
技术标签:
【中文标题】用“void*”转换“char”指针并取消引用它【英文标题】:Casting "char" pointer with "void*" and dereferencing it 【发布时间】:2021-12-03 07:39:05 【问题描述】:我认为“cout”函数的下一部分会产生不正确的结果,我使用“void*”对指针进行了强制转换,并试图获取它保存的值。
<< "casted but for value: " << ((void*) (*s)) << endl;
在:
#include <iostream>
#include <cstring>
using namespace std;
int main(void)
char* s=(char*) malloc((12+1)*sizeof(char));
strcpy(s,"Hello World!");
cout << "direct value: " << s << endl
<< "casted for address: " << (void*) s << endl
<< "value by direct address calling: " << *s << endl
<< "casted but for value: " << ((void*) (*s)) << endl;
return 0;
结果:
pascal@pascal-Lenovo-ideapad-330-15AST:~/Computer/C++/Programs$ g++ ./p10.cpp
./p10.cpp: In function ‘int main()’:
./p10.cpp:16:49: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
16 | << "casted but for value: " << ((void*) (*s)) << endl;
| ^
pascal@pascal-Lenovo-ideapad-330-15AST:~/Computer/C++/Programs$ ./a.out
direct value: Hello World!
casted for address: 0x55aa8b248eb0
value by direct address calling: H
casted but for value: 0x48
【问题讨论】:
你有什么问题? “我认为“cout”函数的下一部分会产生不正确的结果” 是什么让你认为这是个问题? 这是一个问题,所以这是一个问题。 如果不是 0x48,你认为字符H
的数值应该是多少?
【参考方案1】:
从 cmets 中我注意到认为错误的结果是正确的,因为 ((void*) (*s))
表示指针 s
的值没有类型 (void)
,这将为我们提供第一个十六进制的代码 Ascii char指针中记录的字符串的字符,所以是明智的结果。
【讨论】:
以上是关于用“void*”转换“char”指针并取消引用它的主要内容,如果未能解决你的问题,请参考以下文章