小心const修饰的经过重新定义的(比如LPBYTE、PINT)指针的陷阱

来源:互联网 发布:unity3d 物体放大缩小 编辑:程序博客网 时间:2024/06/10 04:29

不知道大家用过LPBYTE、PINT等东西呢,他们的定义如下(以PINT为例):

typedef int near            *PINT;(摘自windef.h)

去掉near和一些多余的空格,则:typedef int* PINT;

也就是说:PINT就是int*

那么看到下面的函数,你会想到什么?

void fun(const PINT pData){...}

你觉得上面的const有用吗?如果你想用上面的const修饰符来防止fun函数对pData进行写操作,就错了,你可以这样试试:

void fun(const PINT pData)

*pData = 1; //这句编译成功 

int ii[16]; 

pData = ii; //这句编译出错

}

看到了吧!const修饰符根本没有起到对pData的写入操作,反而限制了对变量pData自身的修改!那么试试这样:

void fun(const int* pData)

*pData = 1; //这句编译出错 

int ii[16]; 

pData = ii; //这句编译成功

}

显然,后面这样的定义,达到了限制对pData的写入操作,可见,const PINT和const int*是不一样的!前者相当于const (int*),而后者相当于(const int)*,所以可以认为,const (int*)里面的const修饰的是一个int指针,所以这个指针(pData)自身不能修改,而(const int)*里面的const修饰的是int数据,所以pData里面的数据是无法修改的。注:const (int*)和(const int)*这两种写法并不能通过编译,但我想不到更好的办法来表达他们的不同之处,或许我也没弄明白他们的区别。

原创粉丝点击