首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-07-08 
变量取地址的指针转换后的值和直接强制类型转换的区别#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型数值。

热点排行