c语言中,当const关键字修饰一般常量时,比较好理解变量的意义,就是说这个变量为常量,不能通过这个变量来操作对应的值。而当const修饰指针时,就比较难以理解,因为存在两种情况:指针本身为常量;另一个是指针指向的是一个常量。下面然我们来看一下这两种情况:
const char *p; //p为指针变量,指向char型常量(指向的为常量)
char const *p; //p为指针变量,指向char型常量,与上面等价
char *const p; //p为常量指针,p本身不可改变,指向的是char型变量
一下是一段程序:
char *p4="abc";
const char *p1=p4;
char const *p2=p4;
char *const p3=p4;
*p1='q'; //错误,p1指向的是常量
*p2='w'; //错误,p2指向的是常量
*p3='4';
p1=p4; //合法
p2=p4; //合法
p3=p4; //错误,p3是指针变量,本身不可改变
对于上面的例子我们可以做一个总结,如何更好的认识,当const修饰指针,指针到底是常量,还是指针指向的是常量?
关键在于,修饰指针p最近的一个*
符号在哪,如果*
与所修饰的变量中间有const,那么说明这个指针本身就是const类型,也就是常量指针。举个例子说明一下:
const char *p1; *
与p1中间没有任何东西,说明p1是指针变量,指向常量.
char *const p3;*
与p3中间有const修饰,说明p3是指针变量.
说明以上问题,我们使用上面的法则来看更复杂的例子:
//修饰p1最近的是*,因此p1是指针变量,指向的是(指向char型常量的指针)
char const **p1;
//同上
const char **p2;
//修饰p3最近的是*,因此p3是指针变量,指向的是(指向char型变量的常量指针)
char *const *p3;
因此:
char *p1;
const char **p2;
char *const *p3;
*p3=p1; //报错
**p3='a';
*p2=p1;
**p2='s'; //报错