2010-04-01 9:58
昨天给朋友讲了 3个问题,
A〉什么是函数指针,本质是?指针的本质? B〉什么是类型,类型的本质是? C〉什么是强制类型转换,本质是?
作者 张世光 亿通科技软件部 060913 QQ:87895224 MSN:Z_55@hotmail.com
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〉什么是强制类型转换,本质是? 强制类型转换 的本质是 程序员告诉编译器“你不用担心,这里的类型变化是正确的”。 |