变量取地址的指针变换后的值和直接强制类型转换的区别
变量取地址的指针转换后的值和直接强制类型转换的区别#includeiostreamusing namespace stdint main(vo
变量取地址的指针转换后的值和直接强制类型转换的区别
#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都是进行了数值上的转换,它们都是右值,不能出现在内建赋值操作符的左边。
另一个例子,右值不可以用内建取地址操作符获取地址:
int a; char const * b; b = &(*(char*)&a);//可以,*(char*)&a是char类型的左值,可以取地址 //&*(char*)&a)是char*类型,可以赋值给char const * 类型的变量b b = &(static_cast<char>(a));//错误!static_cast<char>(a)是右值,不可以取地址 b = &((char)a);//错误!(char)a是右值,不可以取地址。如果你对“左值”与“右值”的概念不清楚,也可以简单地理解为:
变量有地址,*(char*)&a是把int型变量a当成char型变量使用
数值没有地址,static_cast<char>(a)和(char)a是把int型变量a的数值取出来转换为char型数值。