前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >const类型变量的详细解读

const类型变量的详细解读

作者头像
黑泽君
发布2018-10-11 16:40:13
1.3K0
发布2018-10-11 16:40:13
举报
文章被收录于专栏:黑泽君的专栏黑泽君的专栏

const类型变量 -------------------------------------- int i; const int *p; -------------------------------------- int i; int *const p = &i; -------------------------------------- int i; const int *const p = &i;

三者有何区别呢? --------------------------------------

指向常量的指针 和 指针常量

const int *p;  //定义一个指向常量的指针。

int *const p;  //定义一个指针常量,一旦指向某一变量的地址后,不可再指向其他变量的地址。(注意:指针常量也叫常量指针

二者区别: const int *p; //p是一个变量,但指向一个常量。(即p可以指向任何地址,但是只能通过*p来读这块地址的内容,不能通过*p来写这块地址的内容)

int *const p; //p是一个常量,但指向一个变量或者常量。(即如果一旦p指向了任何一个有效的地址后,就不可再指向其他变量的地址,但可以通过*p来读写这块地址的内容)

-------------------------------------- 1. const int *p; const用来修饰int *,*p的内容不可变。

代码语言:javascript
复制
 1 linux下示例代码如下:
 2 
 3 #include <stdio.h>
 4 
 5 int main01()
 6 {
 7     int a = 0;
 8     int *p = &a;        //此时的p指向了一个int类型的地址,可以通过*p的方式来修改这个内存a的值。
 9     *p = 10;
10     printf("a = %d\n", *p); //或者printf("a = %d\n", a);    //此时的*p可读可写。
11 
12     return 0;
13 }
14 
15 int main()
16 {
17     int a = 0;
18     const int *p = &a;  //此时的p指向了一个int类型的地址,但不可以通过*p的方式来修改这个内存a的值。
19     //*p = 10;
20     a = 10;             //但是呢,不可以通过*p来改a的值,可以通过a去修改a的值。
21     printf("a = %d\n", *p); //或者printf("a = %d\n", a);    //此时的*p可读不可写。
22 
23     //c语言的一个小漏洞
24     const int b = 100;
25     //b = 0;    //定义了一个常量,那么这个常量权限是只读了。
26 
27     //通过指针的方法:即可以通过指向一个变量地址的指针去指向它,然后通过*p1去间接的修改b的值。
28     //注意编译的时候会出现警告!我们忽略这个警告强行改!这时把b的值改了!!!
29     //warning: assignment discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
30     //警告:赋值时从指针目标类型丢弃“const”限定符[-Wdiscarded-qualifiers]
31      
32     //这就是在c语言中用常量的时候不用const了!
33     //因为c语言中的const是有问题的,因为可以通过指针变量间接的修改const定义的常量的值,所以在c语言中用#define定义常量的时候更多。
34       
35     //为什么#define不能改呢?实质上#define就是一个文本替换,直接把它替换成一个整数了,整数是一个常量,又不是一个变量。
36     //但是在C++中就没有这个漏洞了。为什么呢?因为c++里面的const是个真的const,而c语言中的const只是在语法的角度不让你去赋值,实际上是假的。
37     //这是c语言本身存在的弱项。
38 
39     int *p1;    
40     p1 = &b;    //为了避免这个warning,使用强转即可:p1 = (int *)&b;
41     *p1 = 0;
42     printf("b = %d\n", b);  //或者printf("b = %d\n", *p);
43 
44     int *const p2 = &a;    //表示p2指向了a的地址,而且p2只能指向a的地址,不可再指向其他变量的地址。
45     //p2 = &b;//直接编译错误//p2是一个常量指针,p2只能指向固定的一个变量的地址,但可以用*p2读写这个变量的值。
46 
47     return 0;
48 }

2. int *const p = &i; const用来修饰p,p是一个常量指针,p只能指向固定的一个变量的地址,但可以用*p读写这个变量的值。

指针p的地址不可变。即表示p指向了i的地址,而且p只能指向i的地址,不可再指向其他变量的地址。

int i = 0; int j = 0; int *const p = &i; p = &j;    //错误 i = 1;    //正确 *p = 1;    //正确

3.const int *const p = &i;

同时限制了指针指向的内容和指向的地址。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-12-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档