C语言关于const、static、volatile、sizeof、extern关键字的深度剖析

Const(恒定不变的)

       被Const关键字修饰的变量、数组、指针、函数返回值,在编译时告诉编译器这是一个只读变量,且在定义时不会分配内存空间给变量,此时编译器无法得知它的值,只有在运行过程中它是一个全局的只读变量,被存放在静态区。

       Const与宏define有点相似,都不具有可变性(不能在使用过程中修改它的值),都需要在定义同时初始化。但define是只做简单的替换,相当于是一个符号而非变量,而const修饰的仍然是一个变量。

例如:

#define min 100

cons tint max =100;

int Array[min];

int Array[max];//     —— C语言中非法,编译时max是一个非确定的值

const修饰一般(只读)变量、(只读)数组时 int const I = 2; ó const int I = 2;

const修饰指针时:

const int *p; ó int const*p;表示p指向可以变,但p指向的对象不可变

int *const p; 表示p指向不可以变,但p指向的对象可变

const int*const p;表示都不可以变

将const用于修饰函数的参数,可以防止该参数的值在函数内部被修改。

void fun(cons tint i);

将const用于修饰函数返回值,表明该返回值在调用函数中不能被修改。

const int fun(void);

能在一定程度上节省内存空间分配。

 

Static(静态变量声明)

static修饰的变量为静态变量,被static修饰的变量无论全局还是局部变量都被存在内存静态区。

静态全局变量,一般将其定义在文件的顶端,它的作用域是从它被定义的位置开始到该文件的结尾处,无法在其它文件里或被定义的位置之前使用。

静态局部变量,被定义在函数里面的静态变量,只有在第一次被调用时初始化一次,之后该变量的值不会跟随函数被释放,而是会一直保存在静态存储区,函数下一次被调用时,该变量的值保持不变。在函数外面,这个变量无法被调用。

static修饰的函数为静态函数,与被static修饰的全局变量类似,被static修饰的函数,无法在该文件之外的地方被调用。

 

Volatile(易变的,不稳定的)

volatile关键字用于告诉编译器,它所修饰的是一个值随时可能会被改变的变量,例如多线程中,操作系统中。遇到这个关键字时,编译器会放弃对它进行优化,每一次调用这个变量都会重新到内存中读取一次它的值。

例如:

int i = 10;

int j = i;

int k = i;

在编译时,编译器会对上述三条语句进行优化,执行第二条语句时,会从内存中读取一次i的值给j赋值,但在第三条语句时,不会再去内存中读取i的值,而是直接将刚刚所拿到的值再赋值给k。

这在平常使用中不会出现什么问题,但是在多线程以及操作系统中运行时,会出现问题,即在执行第二条语句时,i的值可能在别的线程中或别的位置被改变。导致执行第三条语句所得到的值不符合预期。这时候加一个volatile关键字修饰就能解决问题。

volatile int i =10;

 

extern(外面的,外来的)

extern是一个声明性修饰符,用于在本文件中声明某个外部文件已经被定义了的变量、函数,通常在跨文件调用变量或函数时用到。

需要注意的是,在本文件中声明时,不能再次初始化该变量。


Sizeof

sizeof是一个可以计算变量所占用内存大小的关键字,不是一个函数,虽然它后面可以带括号(有时也可以省略)。

需要注意的是,sizeof (int);合法,但是sizeof int;是非法的,非法修饰int。


本文是在阅读陈正冲老师所编著《C语言深度剖析》一书所总结的内容,加了一些我自己的理解,更深层次的内容推荐阅读陈老师的原作。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值