书本内容
如果某个类型的别名指代的是复合类型或是常量,那么它用到声明语句里面就会产生意想不到的后果,例如下面的声明语句用到了类型pstring,它实际上是类型char*的别名:
typedef char* pstring;
const pstring cstr = 0; //cstr是指向char的常量指针
const pstring* ps; //ps是一个指针,指向char的常量指针。
上述两条声明语句的基本数据类型都是const pstring,和过去一样,const是对给指定类型修饰,pstring实际上是指向char的指针,因此,const pstring就是指向char的常量指针,而非指向常量字符的指针。
遇到了一条使用了类型别名的声明语句时,人们往往会错误地尝试将类型别名替换为本来的样子,以理解这条语句的含义:
const char* cstr = 0; //对const pstring cstr的错误理解
再次强调一遍:这种理解是错误的。声明语句用到的pstring时,其基本数据类型是指针。可使用char*重写了声明语句后,数据类型变为char, *成为声明的一部分。这样写的结果是,const char成立基本数据类型,前后两种声明截然不同,前者声明了一个指向char的常量指针,改写后的形式声明了一个指向const char的指针。
自己的理解
说明:书中的常量指针定义是:
const double pi = 3.1415926;
const double * const pip = π // pip是一个指向常量对象的常量指针
//第一个 const 修饰的是 double 第二个const 修饰的是pip 。
//书中的常量指针是指:指向不能改变,值可以改变的(因为书中的是const double,书中的值也不能改变)
网上说的常量指针与书中定义相反,所以这个是理解这个问题的最难的地方。网上解释的常量指针一般是指针的指向可以修改,但是指针指向的值不可以修改。参考:【C/C++】 常量指针,指针常量、指向常量的常指针详解-CSDN博客
const pstring cstr = 0; const 修饰的是一个指向char的指针,而这个指针被const修饰 。也就是说 cstr 是指向char的常量指针,指针指向不能更改,指针的值可以更改。
const char* cstr = 0; const修饰char 而 *修饰cstr,这样就是cstr是一个指针 ,指向类型是const char。指针指向能更改,指针的值不可以更改(当然你指向更改的,值也会随之变化,值不可更改值得是指针指向的地址对应的值无法发生变化)。