📣🥳🥳🥳📣
✨Hello! 如果这篇【文章】对你有帮助😄,希望可以给博主点个赞👍鼓励一下😘
📣🥳🥳🥳📣
🤔 类型别名的实现方法
🏷️ 方法一:typedef
关键字
typedef int myint; //myint是类型int的别名
typedef int *pint; //pint是类型int *的别名
typedef int myint, *pint; //连写
🏷️ 方法二:using
关键字
//C11新标准规定的新方法
using myint = int; //myint是类型int的别名
using pint = int *; //pint是类型int *的别名
🤔 复合类型的类型别名
类型别名和类型的名字等价,只要是类型的名字能出现的地方,就能使用类型别名。【但如果某个类型别名指代的是复合类型或常量,则不能直接代入理解,应采用“剥洋葱”的方式来理解】
typedef int myint, *pint;
myint r = 1;
const pint p = &r;
const pint *pp; //未初始化,该指针乱指。每次执行程序` cout<<pp `会发现打印出来的值每次都不一样
1️⃣ 对于const pint p
:
从右往左读,pint
说明p
是一个pint类型
的对象,const
说明p
还是一个pint常量
。再结合下图👇
可见,p
是一个指向r(int类型)
的常量指针
,p
自身的值已无法修改,指向固定向r
2️⃣ 对于const pint *pp
:
从右往左读,*
说明pp
是一个指针
,pint
说明pp
是一个指向pint类型
的指针,const
说明pp
是一个指向pint常量的指针
,因此首先可以明确的是,【通过pp
无法修改pp
所指向的对象的值】。再结合下图👇
💭 对于这个例子,书上有这样一句话
const pint *pp; //pp是一个指针,它的对象是 `指向int类型的常量指针`
也就是说,对于上图中间的这个<未命名>
对象,它是一个指向int类型的常量指针
,它自身的值无法被更改。为什么说中间这个<未命名>
对象是一个常量指针呢?
🥦 思考如下
由于pp
未初始化,因此对于中间这个<未命名>
对象,只能有一种途径来访问读取和修改它——通过pp
。然而pp
是一个指向常量的指针
,只有访问读取的权利,没有修改的权力。也就是说,我们【没有途径】能够【修改】中间这个<未命名>
的对象,因此它也就成了某种意义上的【常量】。所以上面代码的这句注释pp是一个指针,它的对象是 指向int类型的常量指针
有一定合理性。
🥦 附加思考
如果对指针pp
进行初始化👇
typedef int myint, *pint;
myint r = 1;
pint p = &r;
const pint *pp = &p; //已初始化
此时上图应变成👇
此时,就不能再说【pp
指针所指向的对象是一个指向int类型的常量指针
】,而应该说,【pp
指针所指向的对象是一个指向int类型的普通指针
】。
✨如有问题欢迎在底下评论留言或私信!
如果这篇【文章】对你有帮助😄,希望可以给博主【点个赞👍】鼓励一下😘
❤️Thanks for your encouragement❤️