Primer笔记——typedef指针类型别名时的const陷阱

目录

一.typedef int* pint 与 const pint

二.typedef const int *pint 与 pint

三.总结


《C++ Primer》中指出,typedef与指针代指复合类型别名时,可能有意向不到的情况。

下面我们以int为例:

一.typedef int* pint 与 const pint

此时typedef的类型是int的指针,即指针类型

既然pint本身是指针类型,那么const pint修饰的就是指针类型,pint本身就是指向int的常量指针。

即const pint可以改成这种形式:

const pint -> int* const

而人们往往会错误的替换成const int*的形式,这就是误解了const的修饰对象。 

以下面代码为例:

typedef int* pint;
int a = 1;
int b = 2;
const pint p = &a;
//即int* const p = &a

p = &b;//错误,常量指针不能修改指向
*p = 3;//正确,指针指向int变量

//注意:const pint p 与 pint const p等价

那么怎样才能得到我们想要的const int*呢? 

二.typedef const int *pint 与 pint

虽然pint还是一个指针类型数据,但因为const int的存在,此时int是const类型的数据。

pint此时指向const int,即指向常量int的指针。

此时pint可变为如下形式:

pint -> const int* 

 以下面代码为例:

typedef const int* pint;
int a = 1;
int b = 2;
pint p = &a;
//即const int* p = &a;

*p = 3;//错误,p指向常量
p = &b;//正确,p本身是指针变量

三.总结

只要typedef中没有声明const,那么指针永远指向变量。

只要类型别名在使用时有const修饰,那么指针永远是常量指针。

即typedef中const决定指向对象属性,定义时const决定指针自身属性。

说的官方一点就是typedef决定底层const,定义决定顶层const。 

可以总结出如下表格:

typedef定义替换形式含义
typedef int* pint;pint p = &a;int* p指向变量的指针
const pint p = &a;int* const p指向变量的常量指针
typedef const int* pint;pint p = &a;const int* p指向常量的指针
const pint p = &a;const int* const p指向常量的常量指针

先解决问题再写代码——John Johnson


如有错误,敬请斧正 

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

就要 宅在家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值