🌏目录
🤔 类型别名的实现方法
🏷️ 方法一: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类型的普通指针】。
