C++ 无法将float*类型转换为char*
指针类型转换时出错C++ 无法将float*类型转换为char*,c++,function,pointers,C++,Function,Pointers,指针类型转换时出错 如果不将float*类型转换为char*,代码运行良好,但是当我对其进行类型转换时,会出现错误“无法在初始化时将‘float*’转换为‘char*”,即使float*和char*大小相同,我只是想尝试一下 #include <stdio.h> #include <iostream> using namespace std; int processing_block(char*,short*,short*,short*,char*,bool*,bool
如果不将float*类型转换为char*,代码运行良好,但是当我对其进行类型转换时,会出现错误“无法在初始化时将‘float*’转换为‘char*”,即使float*和char*大小相同,我只是想尝试一下
#include <stdio.h>
#include <iostream>
using namespace std;
int processing_block(char*,short*,short*,short*,char*,bool*,bool*);
#define monitor_w 640
#define monitor_h 480
int main()
{
short w=monitor_w/1.05, h=monitor_h/1.05;
short x=monitor_w/2, y=monitor_h/2;
float zoomer=0.5f;
bool resume = false;
bool fix1 = false;
float *pfz= &zoomer;
short *psx= &x;
pfz=(char*)pfz;
char *pcz= pfz;
psx=(char*)psx;
char *pcx= psx;
processing_block(psx,&y,&w,&h,pcz,&resume,&fix1);
cout<<"\nx-\t"<<x<<"\ny-\t"<<y<<"\nw-\t"<<w<<"\nh-\t"<<h<<"\nzoomer-\t"<<zoomer<<"\nresume-\t"<<resume<<"\nfix1-\t"<<fix1<<endl;
return 0;
}
int processing_block(short* px,short* ya,short* wa,short* ha,char* pzoom,bool* resume,bool* fix1)
{
*pzoom=0.02+(*pzoom);
if((*px)-(*ya)>25)
*resume = true;
else{
*fix1= true;
*pzoom=10.0f;
}
}
#包括
#包括
使用名称空间std;
整数处理_块(char*,short*,short*,short*,char*,bool*,bool*);
#定义监视器w 640
#定义监视器
int main()
{
短w=监视器w/1.05,h=监视器h/1.05;
短x=监视器w/2,y=监视器h/2;
浮动变焦器=0.5f;
bool resume=false;
bool-fix1=假;
浮动*pfz=&zoomer;
short*psx=&x;
pfz=(char*)pfz;
char*pcz=pfz;
psx=(char*)psx;
char*pcx=psx;
处理块(psx、y、w、h、pcz、恢复和修复1);
cout您的编译器是正确的。char*
不能隐式转换为float*
,反之亦然
但是,所有数据指针都可以显式转换(重新解释)为所有其他数据指针类型,因此以下格式比较好:
char *pcz = reinterpret_cast<char*>(pfz);
char*pcz=reinterpret_cast(pfz);
请注意,尽管重新解释的格式良好,但另一个问题是通过重新解释的指针进行的间接操作是否具有定义良好的行为。如果原始类型和新类型不是指针可相互转换的,则该行为将是未定义的
char
、unsigned char
和std::byte
都是例外,因为通过指向它们的指针进行的间接寻址是定义良好的,即使指针是从任何其他类型重新解释的,只要指向的对象存在——不过,请记住,如果读取不确定的值,行为是未定义的。其中:
pfz=(char*)pfz; // Does nothing, maybe give an error (assigning char* to float*)
char *pcz= pfz; // Tries to assign pfz (float*) to pcz (char*)
psx=(char*)psx; // Same
char *pcx= psx; // Same
你应该做:
char *pcz= (char*) pfz;
char *pcx= (char*) psx;
如果你的编译器不允许对char*进行强制转换,那它就是自命不凡。标准要求对const unsigned char*
进行强制转换。试试看。你的监视器真的那么小吗?char*不是float*,但它允许对void*进行强制转换。“即使float*和char*大小相同”这是什么问题?什么是代码<浮标< /COD>和<代码> char < /> >大小不相同>代码> *pZoMo> <代码>,如果你原来有一个浮点,你可以用一个字符,用引用代替,你是C++,不是C。你的铸造错误了。<代码> PSX=(char *)psx;
,您将psx
强制转换为char*
,然后将其分配回类型为short*
的psx
,第一个错误。然后执行char*pcx=psx
,因此您尝试在char*
中放置short*
,而不进行强制转换,第二个错误。您只需要char*pcx=(char*)psx
,不带psx=(char*)PSX < /code >,但是对于C++代码来说这看起来很可疑。但是,还有很多其他问题,因为这个代码会导致UB。@ MatthuuBruury:是的。OP的代码也可能包含其他错误。我限制了我对被问到的答案。我认为在这种情况下,关于OP代码实际操作的一些额外指导会更好。@ MatthieuBrucher可以在其他指导下自由回答OP。