强制类型转换及指针本质
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
强制类型转换类型的本质指针的本质函数指针
昨天给朋友讲了 3个问题,
A〉什么是函数指针,本质是?指针的本质?
B〉什么是类型,类型的本质是?
C〉什么是强制类型转换,本质是?
作者张世光亿通科技软件部 060913 QQ:87895224 MSN:Z_55@ A〉什么是函数指针,本质是?指针的本质?
如
void fun(); //函数声明
void (*ptrfun)();//函数指针变量ptrfun 的声明,表明ptrfun这个指针指向一个 void fun()函数类型的函数地址。
〉函数的名字代表函数的地址;
所以,可以这样
ptrfun =fun ;//给ptrfun赋值。此时,ptrfun 就是 fun 函数的别名;
在需要调用 fun()的地方,可以这样写
(*ptrfun)(); //等同于 fun(); //这就是别名的意义。
指针的本质是一个固定长度(32位系统上是4个byte)的空间中放置的内容是一个内存地址。
而指针类型的本质就是对这个地址的解释方式。不同的指针类型,对即使相同的内存地址的解释是不同的,受影响的空间大小也不同。受影响的空间的大小等于sizeof(类型)。
如 short i=0x1234;
short * psort = &i;
char *pchar = &i; //此时 pshort ==pchar;即指向了同一个地址;
那么 (*pshort) 和 (*pchar) 的值各是什么?
假设 sizeof(short)==2
sizeof(char)==1
假如内存中这样:
---地址 0x1000--
| 0x34 |
----------------
| 0x12 |
----------------
那么,psort==0x1000 ,同时,pchar==0x1000 ;
那么,(*psort) 代表是地址0x1000 和 0x1001 这两个字节的内容; <-----由其类型决定
(*pchar)代表地址0x1000 这一个字节的内容; <<-----由其类型决定
B〉什么是类型,类型的本质是?
类型是我们为了方便有效利用内存来表达我们的意思而作的语言上的区分,看上面的解释就可以了解为何有类型区分。这里我想讲另一个类型相关问题。
有人问 TypeDef void (*PtrFun)();
和 void (*ptrfun)(); 有什么区别?
看使用方式,
PtrFun pfun;
void fun();
pfun = ptrfun = fun;
由上面可以看出 PtrFun 是类型,而ptrfun是一个变量。
使用方式自然也有差别,PtrFun 用来定义函数指针变量。而ptrfun已经是一个函数指针变量,可以直接赋值使用。
(*pfun)();
(*ptrfun)(); //
C〉什么是强制类型转换,本质是?
强制类型转换的本质是程序员告诉编译器“你不用担心,这里的类型变化是正确的”。