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

本文探讨了C++中const修饰符的使用方法及其在不同类型指针上的效果差异。通过对比const PINT与const int*的用法,揭示了const在指针变量及所指向数据上如何发挥作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值