const *
const在*左边,指向一个常量。
* const
const在*右边,指针是常量。
1 const int *p;//指向常量的指针,与下面一样
2 int const *p1;//指向常量的指针,与上面一样
1和2,适用于给予查询所有的权限,但是无修改权限。
如:超级管理员,查询所有账户的权限,但是无修改权限。
3 int * const p2;//常量指针
3,适用于给予只能对某个对象修改的权限。
如:客户对自己的账号进行存款、取款操作。
4 const int * const p3;//指向常量的常量指针,与下面一样
5 int const * const p4;//指向常量的常量指针,与上面一样
4和5,适用于给予只能对某个对象进行查询的权限,但是无修改权限。
如:客户对自己的账户进行查询操作。
1 #define _CRT_SURE_NO_WARNINGS 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 //const int *p;//指向常量的指针,与下面一样 7 // 8 //int const *p1;//指向常量的指针,与上面一样 9 // 10 //int * const p2;//常量指针 11 // 12 //const int * const p3;//指向常量的常量指针,与下面一样 13 // 14 //int const * const p4;//指向常量的常量指针,与上面一样 15 16 main1()//指向常量的指针,与下面一样,适用于给予只读权限,无修改权限,如:只有查询权限 17 { 18 int num = 10; 19 num = 3; 20 21 const int data = 20;//const只有初始化的时候可以赋值 22 //data = 998; 23 24 /*严重性 代码 说明 项目 文件 行 禁止显示状态 25 错误 C2166 左值指定 const 对象 hello F : usersdenggelindocumentsvisual studio 2015Projectshellohellomain.c 24*/ 26 27 //const int data1; 28 //data1 = 998; 29 /*严重性 代码 说明 项目 文件 行 禁止显示状态 30 错误 C2166 左值指定 const 对象 hello F : usersdenggelindocumentsvisual studio 2015Projectshellohellomain.c 28*/ 31 32 system("pause"); 33 } 34 35 main2()////指向常量的指针,与上面一样,适用于给予只读权限,无修改权限,如:只有查询权限 36 { 37 int num = 10; 38 int const *p = # 39 //*p = 3; 40 } 41 42 main3()//常量指针,适用于只对某对象进行修改,如:对自己的银行账户存款取款 43 { 44 int num = 10; 45 int data = 20; 46 47 printf("%d ", num); 48 49 int * const p = # 50 //p = &data; 51 *p = 998; 52 53 printf("%d ", num); 54 55 system("pause"); 56 } 57 58 main()//指向常量的常量指针 59 { 60 int num = 10; 61 int data = 20; 62 63 const int * const p = # 64 //p = &data; 65 //严重性 代码 说明 项目 文件 行 禁止显示状态 66 // 错误 C2166 左值指定 const 对象 hello F : usersdenggelindocumentsvisual studio 2015Projectshellohellomain.c 64 67 68 //*p = 998; 69 /*严重性 代码 说明 项目 文件 行 禁止显示状态 70 错误 C2166 左值指定 const 对象 hello F : usersdenggelindocumentsvisual studio 2015Projectshellohellomain.c 68*/ 71 }
const变量,可以通过指针修改
const的本质是伪常量,无法用于数组初始化,以及全局变量初始化。
原因:const仅仅限定变量一旦初始化后无法再直接赋值。
const只是限定一个变量无法直接赋值,但是可以间接赋值。
但是还是有可能被意外修改,例如间接赋值,并不是完全只读,所以并非真正意义的常量。
例如局部const变量在栈区,而不在静态区(静态区会一直存在)。
也不在代码区,因为代码区会禁止修改,代码区间接赋值不可能成功。
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 main() 7 { 8 const int num = 10; 9 10 printf("%d ", num); 11 12 const int *p = #//指向常量的指针,定义一个指针指向一个常量,存储num的地址 13 14 int *pv = (int *)p;//对指向常量的指针进行强制转换 15 16 *pv = 8;//对指针指向内容进行赋值 17 18 printf("%d ", num);//间接的改变了一个常量 19 20 system("pause"); 21 }