指针强制转换
来源:互联网 发布:山长水阔知何处 编辑:程序博客网 时间: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
- 指针强制类型转换
- 指针强制转换问题
- 强制转换指针类型
- 指针的强制转换
- 指针强制转换
- 数组指针强制转换
- 关于指针强制转换
- 指针强制类型转换
- 指针强制转换
- 指针强制转换
- 指针强制类型转换
- 指针强制类型转换
- 指针类型强制转换
- 指针类型强制转换
- 指针强制转换
- 指针的强制转换
- c++ 指针强制转换
- 指针和指针强制转换
- Apache: 启用mod_expires为静态资源添加默认过期
- java实现FTP
- 测试c++代码运行时间方法收藏
- Github开源项目
- HttpClient 基础
- 指针强制转换
- 马伊琍父亲对文章出轨表态:放过我们的孩子吧
- jsp和servlet之间的关系+示例入门
- gethostbyname用法
- 【Unity技巧】调整画质(贴图)质量
- Xib文件如何将iPone项目转到iPad平台
- nutz dao 操作
- 网络臭虫
- Android 使用自定义组件和自定义属性