设为首页 加入收藏

TOP

C语言中-const,volatile
2014-04-06 17:41:59 来源: 作者: 【 】 浏览:297
Tags:言中 -const volatile

  一、const和volatile分析

  1、const修饰变量

  # 在c语言中const修饰的变量时只读的,其本质还是变量

  # const修饰的变量会在内存占用空间

  # 本质上const只对编译器有用,在运行时无用

  原来const不是真的常量

  2、const修饰数组

  # 在C语言中const修饰的数组是只读的

  #const修饰的数组空间不可以被改变

  const int A = {1, 2, 3, 4, 5}

  int *p = (int *)A;

  int i = 0;

  for(i=0; i<5; i++)

  {

  p[i] = 5-i;//报错

  }

  3、const修饰指针

  # const int *p; //p可变,p指向的内容不可变

  # int const *p; //p可变,p指向的内容不可变

  # int *const p; //p不可变,p指向的内容可变

  # const int *const p; //p不可变, p指向的内容不可变

  口诀:左数右指

  当const出现在*号左边时指针指向的数据为常量,当const出现在*后右边时指针本身为常量

  const修饰函数参数和返回值

  # const修饰函数参数表示在函数体内不希望改变参数的值

  # const修饰函数返回值表示返回值不可改变,多用于返回指针的情形

  const int * func()

  {

  static int count = 0;

  count++

  return &count;

  }

  深藏不漏的volatile

  1、volatile可理解为“编译器警告指示字”

  2、volatile用于告诉编译器必须每次去内存中去取变量值

  3、volatile主要修饰可能被多个线程访问的变量

  4、volatile也可以修饰可能被未知因数改变的变量

  int obj = 10;

  int a = 0;

  int b = 0;

  a = obj;

  sleep(100);

  b = obj;

  以上代码,编译器在编译的时候发现obj没有被当成左值使用,因此会“聪明”的直接将obj替换成10,而把a和b都赋值为10.

  课后思考

  # const和volatile是否可以同时修饰一个变量

  # const volatile int i = 0; 这个时候i具有什么属性 编译器如果处理这个变量

  答:可以。这个时候i具有const和volatile的双重属性。i变量不可以在编译过程中被程序代码修改,同时编译器不得对i进行优化编译。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言五子棋胜负判定算法 下一篇字符串替换空格实例题

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: