指针类型转换
各位大大,小弟请教个菜鸟问题:
(某种类型名 *)另一种类型指针变量名
和
*(某种类型名*)&另一种类型指针变量名
这两种类型转换有什么区别,大大们能说得详细些,小弟受教了,谢谢!!!
[解决办法]
你的问题 描述不清
估计是
(某种类型名 *) 这只是强制转化指针。
*(某种类型名 *)&估计是先取地址,然后强制转化指针,然后访问指针的内容。
[解决办法]
一个是强制转换指针类型,一个是强制转换类型后进行赋值或取值操作,有什么区别不区别的
[解决办法]
后面访问了指针,前面没访问,区别就是这里
[解决办法]
可以发现其实结果都是一样的 ...
*(某种类型名*)&另一种类型指针变量名
这里的转换指针级数不对应,【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和第一个效果一样,只是多了一次*和&抵消的操作
*/
[解决办法]