不知道大家用过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)*这两种写法并不能通过编译,但我想不到更好的办法来表达他们的不同之处,或许我也没弄明白他们的区别。