本文写作时长1小时
以前我们学习过C++中的引用,引用就是变量的别名。不光变量可以定义别名,类型也可以声明别名。
声明类型的别名有两种方式
从C继承过来的typedef
typedef double wages;
typedef wages base,*p;
double == wages == base double * == p
这些类型都是可以互换的。其中,typedef是作为基本数据类型的一部分出现,typedef出现的声明语句定义的不是变量而是类型别名。值得一提的是,像*
这样的符号属于类型修饰符,修饰前面的类型用的,而*p
则叫做声明符,声明符中可以出现类型修饰(比如*
),这和定义变量相差无几,所以也能由基本数据类型构造出复合类型来。
新标准中的 别名声明 using
using wages = double;
using p = wages *;
常量指针的类型别名
typedef int *pint;
int i = 0;
const pint pi = &i;
千万别蒙,再解释一遍,typedef int
是属于基本数据类型部分,*
是类型修饰符,表明这是个指针。*pint
属于声明符,声明符中包含了一个类型修饰符*
,pint
是类型别名的名字。那么pint
是什么类型的别名呢?掐头去尾,中间的部分int *
,所以pint
是一个指向int
类型的指针类型。
那么,pi
就是一个指向int
类型的指针变量,由于基本类型中有const
,所以pi
是一个指向int
类型的常量指针,而非大多数程序员理解的只读指针,所以以下这种替换是错误的:
const int *pi = &i;
这样意义则完全不同,这时pi
是一个指向int
类型的只读指针,千万要记住,不能这么替换!
原理解读:
在const pint pi = &i;
中,pi
的基本类型是int *
,也就是指针,const
限定指针,即为常量指针。而在const int *pi = &i;
中,pi
的基本类型是int
,const
限定int
,则成为只读指针。
最后给读者出一道思考题目