一、关键词typedef
typedef的作用:给类型起一个新的名字。只能对类型进行重命名(比如int)
在使用一些类型的时候会不方便,比如定义unsigned int变量需要输入太多字母,就可以使用typedef进行重定义变量名,相当于数学上的换元
(signed和unsigned的作用是判断是否有符号位,符号位是二进制的最前面一位)
二、关键词static
static的意思是“静态”,在C语言中用来修饰变量和函数
修饰局部变量时称为静态局部变量,修饰全局变量时称为静态全局变量,修饰函数时成为静态函数
1.static修饰局部变量
(void的含义是无返回值,也就不需要有数据返回和return)
在主函数中,一进入while循环调用test函数生成一个变量a,由于a是局部变量,test函数结束(离开作用域)之后a被销毁。i++结束后i返回,i小于10再进入循环,在test函数中又重新生成了局部变量a。在一次while循环中由test函数打印a的值为2 ,总共进行了10次循环,所以打印出十个2 。
static修饰变量(函数)使变量(函数)具有记忆性,再次调用函数就会使用上一次打印的值
a在一次test函数结束(离开作用域)之后没有被销毁,下一次test函数开始时直接被拿过来使用,此时test函数内部重新定义局部变量a 的代码已经没用了
static修饰局部变量本质上改变了变量的存储位置
内存分为三个区:栈区、堆区、静态区
栈区内数据的特点:进入作用域创建,离开作用域销毁,所以局部变量是存放在栈区的
当一个局部变量被static修饰之后就变成了静态变量,存放在了静态区
静态区内数据的特点:离开作用域也不销毁,程序的生命周期结束后才销毁
改变了变量的存储位置影响了变量的生命周期
静态变量和全局变量的区别:静态变量还存在作用域,作用域与原来的局部变量一样
变量在创建之后,在整个程序运行的过程中不会改变存储位置
用F10打开监视,运行到test函数时F11进入test函数,然后在test函数右键点击“转到反汇编”
发现static int a=1没有对应的汇编语言,程序执行时没有汇编语言的代码不能参与执行,所以程序运行时a永远是第一次创建好的a
对a和a的地址&a进行监视发现,随着循环进行,a在变化,但&a不变(只有F11进入test函数之后才能监视a和&a)
2.static修饰全局变量
当static修饰全局变量时,另一个文件的函数不能通过extern声明来调用该全局变量
因为全局变量具有外部链接属性,static修饰全局变量时,全局变量的外部链接属性就变成了内部链接属性,其他的源文件(.c)就不能使用该全局变量
3.static修饰函数
函数也是具有外部链接属性的:
函数被static修饰过后,外部链接属性也变成了内部链接属性,其他的源文件(.c)就也不能使用:
三、关键词register
register——寄存器关键词
变量放在寄存器中就成了寄存器变量,访问的速度更快
四、define定义常量
define可以在主函数前定义一个常量,主函数中都可以使用这个常量
称为difine定义标识符常量
五、宏
宏的特点是宏具有参数
先写#define,宏的名称(宏名)是ADD,括号里是宏的参数(x,y),宏体是((x)+(y))
宏的参数是没有类型的
宏的作用是完成替换,工作原理就是将主函数的变量(a,b)送到宏的参数中,主函数中的宏名被替换成了宏体