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

指针类型转换,该怎么处理

2012-02-14 
指针类型转换各位大大,小弟请教个菜鸟问题:(某种类型名*)另一种类型指针变量名和*(某种类型名*)&另一种类

指针类型转换
各位大大,小弟请教个菜鸟问题:

(某种类型名   *)另一种类型指针变量名    



*(某种类型名*)&另一种类型指针变量名

这两种类型转换有什么区别,大大们能说得详细些,小弟受教了,谢谢!!!

[解决办法]
你的问题 描述不清
估计是
(某种类型名 *) 这只是强制转化指针。

*(某种类型名 *)&估计是先取地址,然后强制转化指针,然后访问指针的内容。
[解决办法]
一个是强制转换指针类型,一个是强制转换类型后进行赋值或取值操作,有什么区别不区别的
[解决办法]
后面访问了指针,前面没访问,区别就是这里
[解决办法]
可以发现其实结果都是一样的 ...

*(某种类型名*)&另一种类型指针变量名
这里的转换指针级数不对应,【2级指针强转为1级指针】
一般不会有这样的操作。

或许应该是:
*(某种类型名**)&另一种类型指针变量名 //转换前后都是2级指针
或者:*(某种类型名*)&另一种类型变量名 //转换前后都是1级指针
[解决办法]
"*(某种类型名*)&另一种类型指针变量名"中的第一个*号后面部分与 "(某种类型名 *)另一种类型指针变量名 "的区别是:

"(某种类型名 *)另一种类型指针变量名 " 这个是强制转化一个指针的类型,如int a = 10;int* p = &a; double* pd = (double*)p;

而"*(某种类型名*)&另一种类型指针变量名"这个强制转化的是一个指向指针的指针(即指针的地址值):如
int a = 10; int* p = &a; double* pd = *(double**)&p; // 先把指针p的地址强制转化为double**,然后再取转化后的这个指向指针的指针的值(这里是一个一维指针)赋值给pd.

实际上上面两个操作的结果是一样的,但用来对理解指针也有好处.
[解决办法]
1)(某种类型名 *)另一种类型指针变量名

首先,这个操作的结果是 指针

作用是,强制把一种指针类型转换成另外一种指针类型

比如 :

float f = 10.5f;
float* pf = &f;

int* pi = (int*)pf;

pi 和 pf 指向同一个数据,但类型不一样

当你用 pi 引用这个数据的时候,程序把这个数据当int看,所以你得到的是如

1093140480 错误的int数,你相当于欺骗了编译器,这个本来是个float,但你

却说是个int

当你用 pf 引用这个数据的时候,程序把这个数据当float看,你得到的是 10.5

这个重转换一般用于基类转派生类

比如 :

class base {};
class dev : public base {};

base* p = new dev;

dev* pv = (dev*)p;

前提是数据本来是派生类的

其他情况下这种转换都是错的,如前面的 float* 转 int*




2)

*(某种类型名*)&另一种类型指针变量名


首先这个的结果是一个 数据 不是指针

比如

float f = 10.5;

int i = *(int*)&f;

这个就相当于

float f = 10.5f;
float* pf = &f;

int* pi = (int*)pf;

int i = *pi; // 得到错误的数据


同1),这个可以用于基类转派生类


还有一个比较奇妙的用法

在存储数据的时候,比如数据都是按DWORD 存


// sava

float f = 10.5f;

DWORD dw = *(DWORD*)&f;

fwrite(dw, sizeof(DWORD), 1, fp);

// read

float f;

DWORD dw;

fread(dw, sizeof(DWORD), 1, fp);

f = *(float*)&dw;



[解决办法]
没啥区别。。。

所谓指针类型,其实是提供给编译器的关于内存地址的一些额外信息。 知道了指针类型,我们才知道这个指针如何运算 : 解引用, ++,等等。
[解决办法]
类型只不过是访问模式,解引用时会用到,而地址都是一样的,同一个地址用不同的访问方式(类型)会得到不同的结果

[解决办法]
#include <iostream.h>
int main(int argc, char *argv[])
{
int vaule = 97;
int *pVaule = &vaule;
cout << (char*)pVaule;
cout << *(char*)&pVaule;
cout << *(char**)&pVaule;


return 0;
}
/*看看这段代码 输出的结果是:a\a
pVaule 是一个指针 &pVaule是指针的指针. 
(char*)pVaule 相当是把vaule转成char后输出

*(char*)&pVaule 这个是什么呢?
&pVaule是指针的指针 一个不定的数值, 将它转成char*后变成了一个指针,这个指针的值和
&pVaule相等(&pVaule=0xffff的话, 就好比是(char*)0xffff). 最后将这个地址所在的内容取出, 
也就是*(char*)&pVaule. 此时对(char*)&pVaule这个地址操作是危险的, 它是一个野指针.
如果操作到非法内存就会当掉. 

*(char**)&pVaule和第一个效果一样,只是多了一次*和&抵消的操作
*/
[解决办法]

探讨
后面访问了指针,前面没访问,区别就是这里

热点排行