const关键字

Posted on 2016-07-26 01:15  DeyuanQin  阅读(482)  评论(0编辑  收藏  举报
  • 问题提出

    请问分析以下几个定义:

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**是不相容的类型,不能相互赋值。