码迷,mamicode.com
首页 > 其他好文 > 详细

const和volatile分析

时间:2015-09-19 12:19:48      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:

c语言中const修饰的变量是只读的,不能直接作为赋值号的左值,其本质还是变量;会占用内存空间;本质上const在编译器有用,运行时无用(还是可以通过指针改变它的值)

1 const int abc=1;
2 
3 int *p=&abc;
4 
5 *p=3;
6 
7 printf("%d\n",abc); //3
 1 const int* p; //p可改变,p指向的内容不可改变
 2 
 3 int const* p; //p可变,p指向的内容不可改变
 4 
 5 int* const p; //p不可变,p指向的内容可变
 6 
 7 const int* const p; //p和p指向的内容都不可变
 8 
 9 //当const出现在*左边的时候,指针指向的内容不可改变
10 
11 //当const出现在*右边的时候,指针本身的内容不可改变    
12 
13 内容不可变,不是绝对的,任然可以通过指针改变其内容  左数右指:在左边,数据内容不可变;在右边,指针内容不可变

const修饰的函数参数表示在函数体内不希望被改变;const修饰的函数返回值表示返回值不可改变,多用于返回指针的情形。

 1 const int* func()
 2 
 3 {
 4 
 5   static int count = 0;
 6 
 7   count++;
 8 
 9   return &count;
10 
11 }
12 
13 int main()
14 
15 {
16 
17   int i = 0;
18 
19   const int* p=func();
20 
21   printf("%d\n",*p);
22 
23   return 0;
24 
25 }
 1 const int* func()
 2 
 3 {
 4 
 5   static int count = 0;
 6 
 7   count++;
 8 
 9   return &count;
10 
11 }
12 
13 int main()
14 
15 {
16 
17   int i = 0;
18 
19   int* p=func();  // 会报出错
20 
21   printf("%d\n",*p);
22 
23   return 0;
24 
25 }

volatile:用于告诉编译器每次去内存中取变量的值,不去做优化;主要修饰可能被多个线程访问的变量;也可以修饰被未知因素被改变的变量:
编译器的优化:如果发现某个变量从未出现过在赋值左边的情况,那么这个变量就直接替换成其值,但是如果被其他因素修改,所以就会出错。

1 volatile int i=0

 

const和volatile分析

标签:

原文地址:http://www.cnblogs.com/data1213/p/4821162.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!