免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5863 | 回复: 15
打印 上一主题 下一主题

[C] 砖家往这里瞧!!一个简单的c问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-21 08:53 |只看该作者 |倒序浏览
一个参数既可以是const还可以是volatile吗?解释为什么。{:2_176:}

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
2 [报告]
发表于 2013-09-21 09:01 |只看该作者
我是砖家: 可以, 因为它即是const的, 又是volatile的。

论坛徽章:
0
3 [报告]
发表于 2013-09-21 09:25 |只看该作者
真的吗??一个变量既是const 又是volatile {:2_166:} 这样不矛盾?、??  回复 2# folklore


   

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
4 [报告]
发表于 2013-09-21 09:39 |只看该作者
http://blog.csdn.net/tigerjibo/article/details/7427366
ctrl+f 搜“4.”,可以找到答案,不过要彻底看懂,还是要先看前面的部分。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
5 [报告]
发表于 2013-09-21 09:54 |只看该作者
回复 4# _nosay


    一个状态寄存器, 硬件将会改变它, 而对程序是只读的, 这个还要“看前面”才能懂?

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
6 [报告]
发表于 2013-09-21 13:12 |只看该作者
对于这个问题,我认为必须要解释为什么const和volatile放一起会有人觉得很奇怪。
因为很多人误解了const的真正含义,很多初学者认为const修饰的就是常量,而常量不会改变,而既然不会改变,那volatile就没有意义。
但是实际上这正是对const的误读,const其实只是一种限制约定,也就是某个东西X不能由const修饰的变量来修改,但是这个X仍然可以被其他非const修饰的变量来修改,比如
int x;
int* p = &x;
const int* q = &x;
*p=0;        //允许
*q=0;        //错误
虽然p和q指向同一块内存,但是q的const并不能限制p的写入,也就是说const只是限制了q的写入,这是一种语法约定而已,并不表示q所指向的内存就是一个常量并且绝对不会改变。
如果能理解这一点,那么const和volatile放一起就并不奇怪了。而且这种用法在不同线程之间用来做一些状态控制也是偶尔有见到的。

论坛徽章:
0
7 [报告]
发表于 2013-09-21 14:29 |只看该作者
灰常感谢{:2_172:} 回复 6# w_anthony


   

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
8 [报告]
发表于 2013-09-21 20:06 |只看该作者
回复 1# Gegung

const表示你不能改,但不代表它不会变。

所以C++标准委员会里一直有呼声,要把这个词改成readonly,但是因为兼容性的问题只好作罢。

论坛徽章:
0
9 [报告]
发表于 2013-09-22 16:21 |只看该作者
学习了。:wink:

论坛徽章:
0
10 [报告]
发表于 2013-09-22 17:24 |只看该作者
这个帖子很受启发,自己做了一个实验想验证一下,但是结果不尽如人意,请大家看看。我机器是AIX主机,做了一个这样的实验,代码如下:
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <strings.h>

  4. int main(void)
  5. {
  6.         const int i = 10;
  7.         int *p;
  8.         p = (int *)&i;

  9.         *p = 20;

  10.         printf("i = [%d]\n", i);
  11.         return 0;
  12. }
复制代码
可以编译,结果是
$ ./test3   
i = [10]
内容并没有修改,变换了一下const int i = 10;的位置
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <strings.h>
  4. const int i = 10;
  5. int main(void)
  6. {
  7.         int *p;
  8.         p = (int *)&i;

  9.         *p = 20;

  10.         printf("i = [%d]\n", i);
  11.         return 0;
  12. }
复制代码
进程编译通过,但是溢出,用dbx跟踪后发现出错在*p = 20;这条语句上,大家谁能解释解释看,是啥原因?

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP