正在阅读:C/C++编程新手错误语录(续二)C/C++编程新手错误语录(续二)

2005-09-16 10:08 出处:PConline 作者:宋宝华 责任编辑:moningfeng

  正因为各种指针类型在本质上都是“泛整型”,因此它们可以互相转化:

int a, b;
memset( (char*) &a, (char*) &b, sizeof(int) );


  等价于:

int a, b;
a = b;


  从来没有人会用memset( (char*) &a, (char*) &b, sizeof(int) )来代替a = b,这里只是为了说明问题。下面的代码则经常用到:

int *p = (int *) malloc(100*sizeof(int));
memset ( p, 0, 100*sizeof(int) ); //将申请的内存空间清0


  我们看memset的函数原型为:

void * memset ( void * buffer, int c, size_t num );


  实际上它接受的第一个参数是无类型指针,在memset函数体内,其它任意类型的指针都向void *转化了。类似的内存操作函数memcpy所接受的源和目的内存地址也是无类型指针。

  char *转化为int *后的值虽然不变(还是那个地址),但是其++、--等操作的含义却发生了变化,这也是要注意的。

char *p;
++p;


  与

char *p;
++(int *)p;


  的结果是不一样的,前者的p值加了1,而后者的则增加了sizeof(int)。

  下面来剥Windows程序设计中消息传递函数两个参数的皮,看看它们究竟是什么:

typedef UINT WPARAM;
typedef LONG LPARAM;


  原来,WPARAM和LPARAM其实都属于“泛整型”,所以不要报怨消息处理函数只能接受“泛整型”。实际上,从指针的角度上来讲,在C/C++中,可以获得任何类型实例(变量、结构、类)的指针,所以Windows的消息处理函数实际上可以接受一切类型的参数。

  惊天动地一句话:“泛整型”可表征一切。
键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品