C中重要的几个关键字

今天我们来说一下C语言中的几个关键字,这都是前几天偷懒的下场,本来应该早早就写了这一篇的。

1.static关键字

首先,对于这个关键字,我们很熟悉,接下来我们来说一下它的作用:
当static用于函数定义时,或者用于代码块之外的变量声明时,static关键字用于修改标识符的链接属性,会将这个函数或者这个变量变为内部链接,只能当前的他们所在的源文件对这个函数或者变量进行访问。

当它用于代码块内部的变量声明时,static关键字用于修改变量的存储类型,从自动变量修改成了静态变量,变量的链接属性和作用域不受影响。这种方式声明的变量在程序执行之前创建,并在程序的整个执行期间一直存在,而不是像局部变量一般,每次在代码块开始执行时创建,在代码块执行完毕销毁。

2.register

这个关键字我想只要学习过单片机的都应该知道,寄存器的英文,在C中,这里叫做寄存器变量,我们要知道,对于计算机来说,存储变量的地方总共有三个:寄存器,普通内存,运行时堆栈。在这三个地方存储的变量具有不同的特性。
register用于自动变量的申明,提示它们应该存储于机器的硬件寄存器而不是内存中,这类变量称为寄存器变量。寄存器变量的特点就是访问起来效率会更好。但是,要知道,寄存器大小也是有限的,所以只能选择几个变量存储于寄存器中,其他会按照自动变量处理,一些编译器会有一个优化,将自动变量优化成寄存器变量。
注意:对于寄存器变量,必须是一个单个的值,另外,它的长度必须小于等于整形的长度,而且由于是寄存器变量,所以&可能是对它无用的。

3.const

const关键字很常用,也是面试笔试经常出的一个点,const的英文意思是恒定不变的,通常称之为常量,其实const应该是只读的变量,其值在编译时不能被使用,因为编译器在编译时不知道其内存的内容。const定义的只读变量在程序运行过程中只有一份备份(因为是全局的只读变量,存放在静态区),const修饰的只读变量是在编译的时候确定其值。
接下来,要说的一点很重要:
const修饰指针:

const int *p;
int const *p;
int *const p;
const int *const p;

个人感觉这四个是必须要掌握的。
const int *p;这个是指针指向的值是不可以变,指针的值可以变。
int const *p;这个和上面是一样的。
int *const p;这个是指针的值不可以变,指针指向的值可以变。
const int *const p;这个是指针的值和指针指向的值都不可以变。
指针的值,就是指针的内容,存放的变量的地址。
指针指向的值,说的就是变量的内容。
如果还是搞不清指针的问题,可以去看我的另外一篇博客:指针?数组?
至于其他关于const的问题,都很简单,在这里就不多说了。

4.sizeof

也许你会惊讶,不过真的,sizeof是一个关键字,并不是你平时所想的运算符。
他是用来计算变量所占空间的大小。
sizeof操作符里面不要有其他运算,否则不会达到预期的目的。
在这里要注意,在计算柔性数组空间大小时,sizeof要在运行时求值,其他皆为编译时求值。

5.volatile

我想好多学过C的人可能压根没听过这一个关键字—volatile,这个英文是易变的,不稳定的意思。用它修饰的变量表示可以被某些编译器未知因素更改,比如操作系统、硬件或者其他线程等。遇到volatile关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地质的稳定访问。
简单地说就是防止编译器对代码进行优化。
接下来我们来看一个问题:

const volatile int i=10;

这行代码有没有问题?如果没有,那么i到底是什么属性?

首先,没问题。被volatile这个关键字修饰的变量在每次访问的时候都要去相应内存地址去找,因为随时可能被修改。被const修饰只能说明这个i不能被程序员修改,但可能被系统所修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值