C语言里
const char **p
char *const *p
char **const p
看变量声明的时候应该从右至左看,以
char *const *p
为例:
先看从右至左第一个符号*,这表明变量p是指针,再看第2个符号const,它修饰的是*p,*p表示p指向的内容,所以,p指向的内容是常量,下一个符号是*,这就表示该常量为指针,然后是char,就表示指向的内容是char
char *const p;与 const char * p;的区别
前者定义P为常量,即只能单向赋值一次,P++展开为p=p+1,重复赋值给常量,出错,后者P为地址变量,地址变量是指向该变量的存储地址值如:4B3F6A,不能赋给一个字符值(字符相当于ascii表中对应的整数)如强制赋值,会把原地址变量P变为一个两位数的整数,造成地址指针溢出。而p++,则表示把该地址变量向下一个存储单元移动一位,如4B3F6A到4B3F6B.所以合法。
红字部分是否会造出程序跑飞一种可能?
const char * p 和 char const * p 是一个意思,都是p所指向的变量的值不能改变,例如: const char ch = 'a'; const char* p = &ch; *p = 'b'; //这样是错的 char* const p,意思是p所指向的地址是不能改变的,例如: char* const p = &ch1; p = &ch2; //这样是错的