指针强制转换

来源:互联网 发布:山长水阔知何处 编辑:程序博客网 时间:2024/04/29 12:30

C 和 C++ 的指针强制转换时不太一样的, C++ 提供了4中类型,用于更加精细化控制指针的强制转换。

1、指针转换原理

讨论指针的强制转换之前,我们先要理解清楚指针的根本含义。最通俗的解释,指针即是地址,但是,指针绝不仅仅只是地址。

1)指针存着所指对象地址

2)指针存着所指对象的类型和类型大小

试想我们定义一个某类型指针p,后可以p++,p--,*p这些都与“指针记录了所指对象类型大小”有关,不然p++和p--  一次跳了多远?还有*p一次取了多长,都是由记录的类型大小决定的:如int *p=&i;那么++ 一次至少会跳int那么远即4个字节(连续存储下),*p一次也会从p所指向地址为起点取出int那么长(4字节)空间的二进制信息,并将这些二进制翻译成“指针内部存着的其所指向的类型”的类型。

初始化指针就是:

(1)记下所指对象的地址

(2)同时记下所指类型和类型大小。

(3)对一个指针解引用(*p)就是从指针所指地址为起点,读出所指类型大小那么大的空间的二进制,然后将二进制翻译成所指类型

(4)而++,——操作就是向前或向后跳所指类型那么大小的空间

看下面实例:

#include <iostream>using namespace std;int main(){int t = 65<<8;char *p = (char*)&t + 1;std::cout << (*p) << std::endl;return 0;}
小端模式下:(注意此代码不具有移植性,应该避免此类代码)

Output:

65

p存储的类型原本应该是t的类型int,然而由于(char*)的出现p中存储的类型将变成char类型,大小也为char那么大即一个字节,而后+1,这时这一跳将因为目前对象是char类型,而只跳一个字节(8位)

综合:只要指针间在“能转换的情况下”我们就可以转来转去,只要保证不对指针进行移位就可以保证指针所指向地址一直不变转换仅仅转的是里面存的类型和类型大小

2、C++ 指针强制转换

1)

reinterpret_cast类型转换函数将一个类型的指针转换成另一个类型的指针。这种转换不用于修改指针变量值数据存放的格式(不改变指针变量值),只需在编译期间重新解释指针的类型就可以做到。
2)

const_cast用于去除指针变量的常量属性,将它转换为一个对应指针类型的普通变量,反过来,也可以将一个非常量的指针变量转换为常量指针变量。这种转换是在编译期间作出的类型更改。

3)

stactic_cast主要用于基本类型之间和具有继承关系的类型之间的转换,这种转换一般会改变变量的内部表示方式,因此static_cast用于指针的转换没有太大的意义。即使允许指针类型的转换,也不及reinterprret转换的效率高。

4)

dynamic_cast(在运行期间实现转换,并可以返回转换成功与否的标志)

参考链接:

http://www.cnblogs.com/alexqdh/archive/2011/06/09/2075713.html

0 0
原创粉丝点击