现在的位置: 首页 > 综合 > 正文

Const 与 *

2014年09月18日 ⁄ 综合 ⁄ 共 1290字 ⁄ 字号 评论关闭

上一次的问题如下:
/* --------------------------------------------------------------------------*/
问题:
下面的代码中编译器会报一个错误,你知道是哪个语句错了吗?
typedef char * pStr;
char string[4] = "abc";
const char *p1 = string;
const pStr p2 = string;
p1++;
p2++;

答案与分析:
  是p2++出错了。typedef和#define不同,它不是简单的文本替换。
上述代码中const pStr p2并不等于const char * p2。
const pStr p2和const long x本质上没有区别,都是对变量进行只读限制,
只不过此处变量p2的数据类型是我们自己定义的而不是系统固有类型而已。
因此,const pStr p2的含义是:限定数据类型为char *的变量p2为只读,因此p2++错误。

看了这个解答之后,我对const的限定内容产生了疑惑,const到底限定什么呢,特别是与指针*一起使用的时候?
请问,下面分别用const限定不可变的内容是什么?
1)、const在前面
  const int nValue;            //nValue是const
  const char *pContent;         //*pContent是const, pContent可变
  const (char *) pContent;      //pContent是const,*pContent可变

2)、const在后面,与上面的声明对等
  int const nValue;            // nValue是const
  char const * pContent;        // *pContent是const, pContent可变
  (char *) const pContent;      //pContent是const,*pContent可变
  char* const pContent;         // pContent是const,*pContent可变
  char const* const pContent;   // pContent和*pContent都是const

答案与分析:
  当const所在代码段中不包含括号时,沿着*号划一条线,
如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
如果const位于*的右侧,则const就是修饰指针本身,即指针本身是常量。

  另外需要注意:对于const (char *) ; 因为char *是一个整体,相当于一个类型(如 char),因此,这时限定指针是const。

/* --------------------------------------------------------------------------*/
关于const的另外一个小问题:
为什么下面的例子在使用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢? 
  const int n = 5;
  int a[n];

抱歉!评论已关闭.