变量取地址的指针变换后的值和直接强制类型转换的区别

变量取地址的指针转换后的值和直接强制类型转换的区别
#include<iostream>
using namespace std;
int main(void) 

int ch; 
ch=getchar();
cout<<ch<<endl;
cout<<*(char*)(&ch)<<endl;
cout<<(static_cast<char>(ch))<<endl;
cout<<(char)ch<<endl;
return 0; 
}
*(char*)(&ch),(static_cast<char>(ch)),(char)ch这三个有什么区别吗,还是完全等价,求解释

------解决方案--------------------
*(char*)(&ch);
//相当于 

char * tp=&ch;
char & t =*tp;


这效果就是引用了,不过同时做了类型转换。
(static_cast<char>(ch)),(char)ch 这个只是对 ch的值,做类型转换,起不到这个作用。
*(char*)(&ch) 同时作用于地址和值,还做了类型转换。

换句话说,*(char*)(&ch)是个左值表达式!

*(char*)(&ch)='a',; //没问题
char ca =*(char*)(&ch); //没问题,左值可以作为右值使用。
(static_cast<char>(ch)) ='a' ;//不可以,(static_cast<char>(ch)),是个右值表达式。
(char)ch ='a' ;  // 不可以,(char)ch ,一样是右值表达式。




 
------解决方案--------------------
引用:
Quote: 引用:

*(char*)(&ch);
//相当于 

char * tp=&ch;
char & t =*tp;


这效果就是引用了,不过同时做了类型转换。
(static_cast<char>(ch)),(char)ch 这个只是对 ch的值,做类型转换,起不到这个作用。
*(char*)(&ch) 同时作用于地址和值,还做了类型转换。

换句话说,*(char*)(&ch)是个左值表达式!

*(char*)(&ch)='a',; //没问题
char ca =*(char*)(&ch); //没问题,左值可以作为右值使用。
(static_cast<char>(ch)) ='a' ;//不可以,(static_cast<char>(ch)),是个右值表达式。
(char)ch ='a' ;  // 不可以,(char)ch ,一样是右值表达式。




 
你说(char)ch 只是对ch的值做了类型转换,这怎么理解,能举个例子吗


例子4楼已经给你了,就在被你引用的部分:
static_cast<char>(ch)和(char)ch都是进行了数值上的转换,它们都是右值,不能出现在内建赋值操作符的左边。