变量取地址的指针转换后的值和直接强制类型转换的区别
#include<iostream>*(char*)(&ch),(static_cast<char>(ch)),(char)ch这三个有什么区别吗,还是完全等价,求解释
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);
//相当于
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 ,一样是右值表达式。
[解决办法]
例子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型数值。