指针的强制类型转换思考

原创 2012年03月22日 21:46:25

以前都没怎么特意的注意指针的强制类型转换。对于int *a=(int*)malloc(sizeof(int)*4);这样的语句感觉这样写都是理所当然的,因为要赋值的话两边的数据类型至少要一样吧。当时对于指针的强制类型转换在内存中的体现没有什么本质的认识。
在编程中,指针的强制类型转换引起我认真注意的是在对位图的操作中,在那段读写位图文件的代码函数中大量的用到了指针的强制类型转换,本篇文章也会以那段代码来做文章的了结。

为了认识指针的强制类型转换,我在程序中写入这么一段代码:

#include "stdafx.h"
#include <iostream.h>
struct student//学生
{
char *name;
int old;
};
struct CLASS//班级
{
student st;
int nunb;
};
int main(int argc, char* argv[])
{
CLASS cla; //班级对象
cla.nunb=29;
cla.st.name="liunian";
cla.st.old=22;
cout<<&cla<<endl;
student *st=(student*)&cla;
cout<<st<<endl;
st->name="yixiaobing";
st->old=21;
cout<<cla.st.name<<endl;
return 0;
}//可能名字不规范,将就着看吧


可以看到指针的强制类型转换后他的值是不会变的, 再怎么转换,他指的不还是他块地址吗!所以指针值不会变,变的是指向那块地址的数据类型。而什么是数据类型,为什么要数据类型。我把上面的main函数中的代码改变一下:

#include "stdafx.h"
#include <iostream.h>
#include "Fish.h"
#include "Animal.h"
struct student
{
char *name;
int old;
};
struct CLASS
{
student st;
int nunb;
};
int main(int argc, char* argv[])
{
student st;
st.name="liunian";
st.old=21;
CLASS *cla=(CLASS *)&st;
cla->st.name="yixiaobing";
cout<<st.name<<endl;
return 0;
}
//我改变的也就是这次先定义的是学生对象,而学生和班级指针互换一下。

可以看到访问正常!但是我们再在上面的代码中稍微改动一点
student st;
st.name="liunian";
st.old=21;
CLASS *cla=(CLASS *)&st;
cla->nunb=29; //加入了这么一句代码。
cla->st.name="yixiaobing";
cout<<st.name<endl;

访问出错了!好了不卖关子了。写了这么多也就是为了说明两点:
1.指针的强制类型转换,可以任意的转换,你完全不需要在乎在转换前=左右的数据类型。你要在乎的是转换后的数据类型是一样的就行了。指针的强制类型转换对于那块内存其实什么也没有做,只是改变了数据类型,改变了数据类型,其实那个内存中的数据什么也没有被改变,以前的二进制数据还是那些二进制数据,只是不同的数据类型读取的方式不同,比如,int型一下读取4字节,char[10]读取10字节而已

2.转换了是为了用指针变量来访问数据的。那怎么来访问数据呢?就是数据类型了。int类型的变量在你转换的指针指向的那块内存中找这个变量,看有没有,如果没有的话,就上面的cla->nunb=29; 这个变量在内存中是没有的。因为开始内存中的数据时student的,自然就没有这个变量了。所以访问错误。

关于指针的强制类型转换我还像提一点。孙鑫的书上,在讲解虚函数的时候有举到一个例子,书48页。
class CAnimal //动物类
{
public:
CAnimal();
virtual ~CAnimal();
public:
void breash();

};
CAnimal::CAnimal()
{
cout<<"animal is constructed"<<endl;
}

CAnimal::~CAnimal()
{
cout<<"animal is xi"<<endl;
}
void CAnimal::breash()
{
cout<<"annimal is breashing"<<endl;
}

class CFish:public CAnimal//鱼类
{
public:
CFish();
virtual ~CFish();
public:
void tupaopao();
};
CFish::CFish()
{
cout<<"fish is constructed"<<endl;
}

CFish::~CFish()
{
cout<<"fish is xigou"<<endl;
}
void CFish::tupaopao()
{
cout<<"fish is tupaopao"<<endl;
}


int main(int argc, char* argv[])
{
CFish fish;
cout<<endl;
cout<<&fish<<endl;
CAnimal *animal=(CAnimal *)(&fish);
cout<<animal<<endl;
animal->breash();
cout<<endl;
return 0;
}

没有好基础的同学可以注意一下继承时子类和父类的构造函数和析构函数调用顺序哦,
上面的显示结果为什么会是这样我就不说了,孙鑫书上说的很清楚,我写文章从来不喜欢抄书。下面对比一下下面的代码(主要是改变main函数)

int main(int argc, char* argv[])
{

CAnimal animal;
cout<<&animal<<endl;
CFish* fish=(CFish*)&animal;
cout<<fish<<endl;
fish->tupaopao();
return 0;
}

如果有认真看代码的人应该注意到了一个问题了。本来fish的tupaopao在内存中本来是没有的,但是却为什么没有像上面一下访问出错了呢?到这是类的特权?没有的内存的会在内存中为它分配?不知道,反正他访问没有出现问题。
其实我是一直不喜欢光想这种纯理论的东西的。如果你觉得你对指针强制类型没有问题的话,可以去拿来解决一下实际的问题:位图的读写。代码请参加另一篇文章:

动态显示BMP位图

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

关于指针强制类型转换的思考

说不上是思考,只是想谈谈自己对指针的强制类型转换的理解。之所以写出来,一方面是自己做一个笔记,另一方面也可以和大家探讨探讨,更重要的也是向大家学习。以前总是记不住指针的强制类型转换的格式,归根结底还是...
  • jinlei2009
  • jinlei2009
  • 2010年07月07日 18:59
  • 7809

指针的强制类型转换和动态分配内存

C里面使用自动分配内存,比如说malloc分配自由存取区,就把它当作是在堆上分配的了, 他的好处是可分配的内存更大更灵活,理论上可以分配用户空间能使用的所有虚拟内存空间, 它是通过链式分配的,比如...
  • jackli8431
  • jackli8431
  • 2015年12月28日 11:16
  • 579

细节问题系列之指针类型强制转换

unsigned int nValue = 0x5D6C7B3E; printf("%c", *((unsigned char *)(&nValue) + 2) + 2
  • shihengzhen101
  • shihengzhen101
  • 2015年11月19日 23:54
  • 1472

C语言: 指针强制类型转换

1. 指向字符串的指针强制转换成指向整型的指针: #include #include #include int main(int argc, char** argv) {  char...
  • mayouyang
  • mayouyang
  • 2015年03月16日 18:00
  • 1676

C/C++强制类型转换、指针类型转换发生了什么

(1)强制类型转换 强制类型转换是对变量对应的内存里面的0和1按照新的类型进行重新解释的过程 代码: #include using namespace std; int main(int, cha...
  • ClamReason
  • ClamReason
  • 2015年01月08日 12:45
  • 1420

【Object-C】指针变量强制类型转换

除了id类型外,指针变量只能调用它编译时类型的方法。而不能调用它运行时类型的方法,即使它实际所指向的对象包含该方法。如果需要让这个指针变量调用运行时类型的方法,就需要强制类型转换。 #import ...
  • sinat_15735647
  • sinat_15735647
  • 2014年11月30日 11:48
  • 1500

C++中指针的强制转换。

一、指针地址的本质和存储      在C++中所有的指针地址的大小都是固定的,也就都是4个字节的大小,地址的本质就是一串0和1的机器代码。任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码...
  • u012273127
  • u012273127
  • 2016年11月21日 17:27
  • 5146

函数指针和数组指针和强制类型转换

在论坛给朋友解释概念的时候写的,记录下来, 省的以后再动口水^_^.还有函数指针比如void (*pf)(void);,既然是指针那么内容也是一个地址,只是这个地址比较特殊。是一个函数的地址。当我们定...
  • jiangxinyu
  • jiangxinyu
  • 2007年02月08日 14:05
  • 2150

指针的强制类型转换

先看下面的例子 #include    int main(void){       int *ip;       int a[2]={0x301,0x44444444};       ip = a; ...
  • lemon_fantasy
  • lemon_fantasy
  • 2008年09月27日 14:52
  • 3851

C语言指针强制类型转换(这个明天看!)

概要: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值。不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是...
  • PengPengBlog
  • PengPengBlog
  • 2016年09月18日 14:15
  • 270
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:指针的强制类型转换思考
举报原因:
原因补充:

(最多只允许输入30个字)