1。对于指针的讨论比较多
const int* p = &ci1;
p = &ci2;
这是指向一个const对象的指针,而p是个指针变量,可以指向ci1,也可以变指向的到ci2
把const写在*之后那就是个常量指针了,p是指针常量,定义时初始化,以后再不能改变指向了
int * const p = &i1;
p = &i2; //err
二者结合的情况
const int* const p = &ci3;
2。涉及typedef的情况
先说一种意见
定义常量可以 const int ci1 = 0;
可以 int const ci2 = 0;
typedef char* C;
const C p = &ch;
这个p是什么呢,是const char* p还是char* const p;
是后者,
原因:const C p中C是个类型,const是修饰p的
所以基于这点,个人建议写const量定义的时候,用int const ci2 = 0;的形式,显式说明const是修饰ci2的
所以,
typedef char* C;
C const p = &ch;
3。论坛回复解释const int* p = &ci1;
p = &ci2;
这是指向一个const对象的指针,而p是个指针变量,可以指向ci1,也可以变指向的到ci2
把const写在*之后那就是个常量指针了,p是指针常量,定义时初始化,以后再不能改变指向了
int * const p = &i1;
p = &i2; //err
二者结合的情况
const int* const p = &ci3;
2。涉及typedef的情况
先说一种意见
定义常量可以 const int ci1 = 0;
可以 int const ci2 = 0;
typedef char* C;
const C p = &ch;
这个p是什么呢,是const char* p还是char* const p;
是后者,
原因:const C p中C是个类型,const是修饰p的
所以基于这点,个人建议写const量定义的时候,用int const ci2 = 0;的形式,显式说明const是修饰ci2的
所以,
typedef char* C;
C const p = &ch;
typedef char *cstring;
extern const cstring cstr;
=============
简易理解方法
typedef并不是宏扩展直接展开
按宏扩展,extern const cstring cstr;《=》extern const char *cstr
你这样看
typedef int cstring;
extern const cstring cstr;
你觉得const是修饰什么呢,是说cstr是个const属性吧,这就对了,那这个cstr是什么类型呢,cstring,即现在的int,所以cstr是个const属性的int量
那现在,typedef char * cstring;
const修饰什么呢,是cstr,所以cstr是const属性,
cstr是什么类型呢,char *字符指针类型,所以cstr是个const属性的字符指针变量
这就清楚了,
指针是个const,不是说指向的对象是个const,所以《=》extern char * const cstr
希望说清楚了