关注公众号

关注公众号

手机扫码查看

手机查看

喜欢作者

打赏方式

微信支付微信支付
支付宝支付支付宝支付
×

C语言之const和volatile"究极"学习(一)

2020.9.29

一、const的用法:

1、const只读变量:

const修饰的变量是只读的,本质上还是变量

const修饰的局部变量在栈上分配空间

const修饰的全局变量在全局数据区分配空间

const只在编译期有用,在运行期没有用

注:const修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边

2、const全局变量的分歧:

在现代c语言编译器中,修改const全局变量将导致程序崩溃

标准c语言编译器不会将const修饰的全局变量存储于只读存储区中,而是存储于可修改的全局数据区,其值依然可以改变

3、代码示例:

(1)只读变量代码示例:

#include <stdio.h>
int main()

  const int a =10;
  printf("a = %d",a);
  a=20;
  printf("a = %d",a);
 
 return 0;

运行结果:

test.c: In function ‘main’:
test.c:8:4: error: assignment of read-only variable ‘a’
   a=20;
   ^

注解:显示这个结果很正常,变量a被const修饰了,它就成了只读的。

(2)如果对变量a的值进行修改:

#include <stdio.h>
int main()

  const int a =10;
  int *p =(int *) &a;
  printf("a = %d",a);
  *p=20;
  printf("a = %d",a);
 return 0;

运行结果:

root@txp-virtual-machine:/home/txp# ./a.out
a = 10
a = 20

注解:通过指针的方式,就能够把a的值进行修改,这也论证了“const修饰的变量是只读的,本质上还是变量”这句话

(3)const修饰全局变量:

代码版本一

#include <stdio.h>
const int b = 40;
int main()

 

  printf("b = %d",b);
  b=20;
  printf("b = %d",b);
 return 0;

输出结果:

root@txp-virtual-machine:/home/txp# gcc test.c
test.c: In function ‘main’:
test.c:10:4: error: assignment of read-only variable ‘b’
   b=20;
   ^

注解:跟const修饰栈上的变量用法一样

代码版本二

#include <stdio.h>
const int b = 40;
int main()

  int *p =(int *) &b;
  printf("b = %d",b);
  *p=20;
  printf("b = %d",b);
 return 0;

运行结果:

root@txp-virtual-machine:/home/txp# ./a.out
b = 40
Segmentation fault (core dumped)

注解:这里出现了段错误,这也验证了我们上面所说的“修改const全局变量将导致程序崩溃”。

同时为了验证“标准c语言编译器不会将const修饰的全局变量存储于只读存储区中,而是存储于可修改的全局数据区,其值依然可以改变”这句话,我把这段代码放到dev c++上进行试验:

说明:我这个版本的编译器支持标准c语言,所以没导致程序崩溃,能够正常运行

4、const的本质

c语言中的const使得变量具有只读属性

现代c编译器中的const将具有全局生命周期的变量存储于只读存储区,不是放在全局数据区

注:const不能定义真正意义上的常量;同时这里注意static关键字修饰的变量,它的生命周期和全局变量一样。

代码示例:

#include <stdio.h>
const int Array[5] = {0};
void fun(int *p,int v)

  *p=v;

int main()

   int const i =1;
   const static int j =2;
   int const array[5] = {0};
   fun((int *)&i,1);
   fun((int *)&j,2);
   fun((int *)&array[2],3);
   fun((int *)&Array[1],4);
  return 0;


推荐
热点排行
一周推荐
关闭