指针类型转换时出错
在不将float *转换为char *的情况下,代码运行良好,但是当我进行tyepcast转换时,即使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;
}
}
答案 0 :(得分:4)
您的编译器是正确的。 char*
不能隐式转换为float*
,反之亦然。
但是,所有数据指针都可以显式转换(重新解释)为所有其他数据指针类型,因此下面的命令格式正确:
char *pcz = reinterpret_cast<char*>(pfz);
请注意,尽管重新解释的格式正确,但是另一件事是通过重新解释的指针进行的间接定义是否具有良好的行为。如果原始类型和新类型不是指针可互换的,则行为将是不确定的。
char
,unsigned char
和std::byte
的例外之处在于,即使从 any 其他指针重新解析了指针,也可以很好地定义通过指向它们的指针进行的间接调用只要指向的对象存在,就键入-尽管请记住,如果您读取一个不确定的值,则行为是不确定的。
答案 1 :(得分:0)
代替:
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;