第一眼见到explicit和volatile可能会一愣一愣的觉得可能是c11或者c14新加的标识符。
其实不是这样,volatile和const两个关键字在C语言的第二个版本KR C的时候就被加入了C标准,他们是两个相对的关键字
1const 修饰符表示这是一个常量类型,这个变量的值不会被程序改变 2 3volatile 修饰符表示这个变量可能被编译器以外的行为(譬如内联汇编程序)改变。
修饰常量变量只要和类型紧挨着就可以
1int const a = 1; 2const int a = 1;
修饰指针时以*号为分界符号
1#include <iostream> 2#include <iostream> 3 4int main() { 5 int a = 10; 6 int b = 20; 7 8 const int *p1 = &a; 9 int const *p2 = &a; 10 int *const p3 = &a; 11 const int *const p4 = &a; 12 int const *const p5 = &a; 13 14 printf("&a = %X\n", &a); 15 printf("&b = %X\n", &b); 16 17 printf("p1 = 0x%X , *p1 = %d\n", p1, *p1); 18 printf("const int *p1 = &a; \n (*p1) = b;通过p修改a的值\n"); 19// (*p1) = b; 20 p1 = &b; 21 printf("p1 = 0x%X , *p1 = %d\n", p1, *p1); 22 printf("p2 = 0x%X , *p2 = %d\n", p2, *p2); 23 printf("int const *p2 = &a; \n (*p2) = b;通过p修改a的值\n"); 24// (*p2) = b; 25 p2 = &b; 26 printf("p2 = 0x%X , *p2 = %d\n", p2, *p2); 27 printf("p3 = 0x%X , *p3 = %d\n", p3, *p3); 28 printf("int *const p3 = &a; \n p3 = &b;修改p的指向\n"); 29// p3 = &b; 30 (*p3) = b; 31 printf("p3 = 0x%X , *p3 = %d\n", p3, *p3); 32 printf("p4 = 0x%X , *p4 = %d\n", p4, *p4); 33 printf("const int *const p4 = &a; \n 二者都不能修改\n"); 34// (*p4) = &b; 35// p4 = &b; 36 printf("p4 = 0x%X , *p4 = %d\n", p4, *p4); 37 printf("p5 = 0x%X , *p5 = %d\n", p5, *p5); 38 printf("int const *const p5 = &a; \n 二者都不能修改\n"); 39// (*p5) = &b; 40// p5 = &b; 41 printf("p5 = 0x%X , *p5 = %d\n", p5, *p5); 42 return 0; 43}
gcc报错结果
1J:\SITP\alg\main.cpp: In function 'int main()': 2J:\SITP\alg\main.cpp:14:11: error: assignment of read-only location '* p1' 3 (*p1) = b; 4 ^ 5J:\SITP\alg\main.cpp:17:11: error: assignment of read-only location '* p2' 6 (*p2) = b; 7 ^ 8J:\SITP\alg\main.cpp:20:8: error: assignment of read-only variable 'p3' 9 p3 = &b; 10 ^ 11J:\SITP\alg\main.cpp:23:11: error: assignment of read-only location '*(const int*)p4' 12 (*p4) = &b; 13 ^ 14J:\SITP\alg\main.cpp:23:11: error: invalid conversion from 'int*' to 'int' [-fpermissive] 15J:\SITP\alg\main.cpp:24:8: error: assignment of read-only variable 'p4' 16 p4 = &b; 17 ^ 18J:\SITP\alg\main.cpp:26:11: error: assignment of read-only location '*(const int*)p5' 19 (*p5) = &b; 20 ^ 21J:\SITP\alg\main.cpp:26:11: error: invalid conversion from 'int*' to 'int' [-fpermissive] 22J:\SITP\alg\main.cpp:27:8: error: assignment of read-only variable 'p5' 23 p5 = &b; 24 ^ 25mingw32-make.exe[3]: *** [CMakeFiles/alg.dir/main.cpp.obj] Error 1 26mingw32-make.exe[2]: *** [CMakeFiles/alg.dir/all] Error 2 27mingw32-make.exe[1]: *** [CMakeFiles/alg.dir/rule] Error 2 28CMakeFiles\alg.dir\build.make:61: recipe for target 'CMakeFiles/alg.dir/main.cpp.obj' failed 29CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/alg.dir/all' failed 30CMakeFiles\Makefile2:78: recipe for target 'CMakeFiles/alg.dir/rule' failed 31mingw32-make.exe: *** [alg] Error 2 32Makefile:117: recipe for target 'alg' failed
将非法的行注释掉之后可以看到允许修改的内容
1J:\SITP\alg\cmake-build-debug\alg.exe 2&a = 72FE24 3&b = 72FE20 4p1 = 0x72FE24 , *p1 = 10 5const int *p1 = &a; 6 (*p1) = b;通过p修改a的值 7p1 = 0x72FE20 , *p1 = 20 8p2 = 0x72FE24 , *p2 = 10 9int const *p2 = &a; 10 (*p2) = b;通过p修改a的值 11p2 = 0x72FE20 , *p2 = 20 12p3 = 0x72FE24 , *p3 = 10 13int *const p3 = &a; 14 p3 = &b;修改p的指向 15p3 = 0x72FE24 , *p3 = 20 16p4 = 0x72FE24 , *p4 = 20 17const int *const p4 = &a; 18 二者都不能修改 19p4 = 0x72FE24 , *p4 = 20 20p5 = 0x72FE24 , *p5 = 20 21int const *const p5 = &a; 22 二者都不能修改 23p5 = 0x72FE24 , *p5 = 20 24 25Process finished with exit code 0