const有“只读”,“常量”的意思,
const后面的定义的内容是只读的。
const char * const * p4
解释为:
*p4 是只读的,(*p4不能赋值)
**p4 是只读的,(**p4不能赋值)
但p4可以赋值。
当编译器看到这句话的时候,它这样解释:
const ( char* const (*p4) )
首先最内层的括号里的*p4 是只读的,然后括号里的const前面的char*说明 (*p4)是个 char*类型的<意味着p4是个char类型的二级指针>,最后外层括号外面的const 说明括号里定义的内容是只读的,也就是说**p4是只读的。
于是,当编译器在后面若是发现下面这样的语句就会报错:
*p4 = XXXX;
**p4 = XXXX;
但是
p4 = XXXX;是合法的。
举例说明:
1 #include<stdio.h> 2 #include<malloc.h> 3 void main() 4 { 5 char **a; 6 const char * const* p4 ; 7 8 a = (char **)malloc(1*sizeof(char*)); 9 *a = (char *)malloc(1*sizeof(char)); 10 11 **a = 65; 12 13 p4 = (char **)malloc(1*sizeof(char *)); 14 15 p4 = a; 16 17 printf("%c",**p4); 18 19 } 20 编译通过并能够正确运行。 21 22 再看这个: 23 24 #include<stdio.h> 25 #include<malloc.h> 26 void main() 27 { 28 char **a; 29 const char * const* p4 ; 30 31 char b = 'h'; 32 33 a = (char **)malloc(1*sizeof(char*)); 34 *a = (char *)malloc(1*sizeof(char)); 35 36 **a = 65; 37 38 p4 = (char **)malloc(1*sizeof(char *)); 39 40 p4 = a; 41 42 printf("%c",**p4); 43 44 **p4 = 66 ; 45 printf("%c",**p4); 46 47 *p4 = &b; 48 printf("%c",**p4); 49 50 }
看下面这段程序:
编译报错:
C:\Documents and Settings\xiaopan\桌面\temp\Cpp1.cpp(21) : error C2166: l-value specifies const object
C:\Documents and Settings\xiaopan\桌面\temp\Cpp1.cpp(24) : error C2166: l-value specifies const object