C的几个关键词register ,typedef与#define,static与extern

本篇博客主讲C语言关键字,针对典型的进行讲述
1、register关键词
关键词register可以用于自动变量的声明,提示它们应该储存机器的硬件寄存器中,而非内存中,这类变量通常称之为寄存器变量。寄存器变量往往比存储在内存中的变量访问起来更加高效。但编译器并不一定就会理会register关键词,如果有太多的变量被声明为register,那么它只会选取前几个,其余的就会按照普通变量处理。
·总结一句话就是,register关键词位于存储单元的顶端(如下图),若有一些数据,指针等频繁使用,为提高效率,可声明为register。
上图即最直观
2、tepedef与#define
这两个关键词常被作为面试问题之一,最能考察应聘者对编程的理解度。
typedef是一个可以为数据类型定义新名字的关键词,例如作者名为康琛,许多人喜欢较为琛一样,typedef常与结构体连用,也常用于创建新的类型名。
例如:
typedef unsigned int u8;
u8 a; //这里u8和unsigned int作用相同
#define的意思是字符替换,也相当于为类型取别名,同时还可以定义常量、变量等。
例如#define SIZE 10;int arr[SIZE];这时候就说明数组的长度为10
注意:#define A for(;😉
printf(“bit”); 会报错,#define 默认为一行,若定义内容多,用换行符
#define A for(;😉
{
printf(“bit”); \·······\为换行符
\ }
重点:两者的区分和使用,面试问题“请简述一下typedef和#define的区别”
“二者作用其实相似,都是替换、取别名作用,相当于生活中我们的小名一样,
(1)二者在使用时,typedef是以语句形式结尾需要‘;’,而#define是宏定义不需要。
(2)我们在给类型名赋予新名称时会使用typedef,而#define通常只用于宏定义变量,若使用#define去定义类型名,并不会报错,但是#define无法正确的处理指针,且在使用时会有副作用。
例如:
typedef int* u8;u8 a,b;
结果为定义了两个指针变量a与b
#define u32 int*
u32 a,b;
结果为定义了一个指针变量*a和一个整型变量b。
作者趣味总结:#define更像是一个笨笨的词,它只会照猫画虎,照搬定义。而typedef更聪明一些,它想是会自己思考一样,因此我们常用typedef来定义数据类型,而#define仅仅来用于定义数据常量.

3、static和extern
这两者的关系并不像和2中的两个那样有相似处,相反还会冲突,因此将二者写在一起。
extern:extern不能定义一个变量,extern表示的是“已经存在一个变量,但是不在当前的编译单元内,需要在其他编译单元中寻找。
注意:必须为全局变量。如果是局部变量,在堆栈分配内存,有作用域范围,变量不能超出作用范围。
例如:
int a=10; ————在.h文件
extern int a;————在.c文件
此时.c文件中的a为10.
笔者建议:若想一个变量为extern型,将其定义语句写在.h文件中,然后在需要的.c文件extern定义。
static:
在全局变量前加上关键字static,全局变量就定义成一个全局静态变量.
静态存储区,在整个程序运行期间一直存在。
初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化);
作用域:全局静态变量在声明他的文件之外是不可见的,准确地说是从定义之处开始,到文件结尾。
(1)修饰局部变量-》提升局部变量的生存周期``——直到程序结束,定义的变量才会被销毁。
(2)修饰全局变量——作用域被限制了-被限制到当前的文件中
(3)修饰函数——作用域被限制了-被限制到当前的文件中

注意:当使用static在头文件定义一个变量或函数,在源文件使用extern时将会报错,二者冲突,原因参考上述(2)和(3)
此博文到此结束
欢迎转载,请标明出处
作者:琛

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值