- 问题提出
请问分析以下几个定义:
const char* p1; char const* p2; char* const p3; const char** p4; char const** p5; char* const* p6; char** const p7;
90%的人前三个没问题。而后面几个估计很多人都会绕糊涂了。本人查过一些资料(包括网上的和书本的),但是个人感觉那些资料对于const的作用、const指针和指向const值的指针的解读略有欠缺且稍显繁乱。因而本人本着抛砖引玉的目的写下这篇笔记,欢迎大家指教和讨论。
- const的作用
const关键字的作用可以概括为:将其右边第一个符号限定为constant。这里的符号定义为:数据类型[*]或者是[*]变量名或*(方括号表示可选)。在定义(声明)某个变量的时候,如果变量名被修饰为constant,则需要在定义(声明)的时候赋值。根据上这一理论,p1~p7为变量名。char* const p3中,const修饰p3,p3在定义的时候必须赋值;const char** p4中,const修饰char*,*p4指向const char*,*p4在定义的时候不需赋值;其它几个同理。
- 关于赋值形式的合法性
《C专家编程》第19页倒数第二段说:
要使赋值形式合法,必须满足下列条件之一:两个操作数都是指向有限定符或无限定符的相容类型的指针,左边指针所指向的类型必须具有右边指针所指向类型的全部限定符。
也就是说,在赋值的时候,要么两边具有相同的限定性且是相容类型,要么左边的限定性比右边的多。结合上一部分const的作用,我们知道const char** 和char**是不相容的类型,不能相互赋值。