目录
1、关键字typedef
typedef顾名思义是类型定义,这里应该理解为类型重命名。
我们应该怎么用呢? 比如我们要定义一个无符号的整型,我们可以这么写
有没有发现
unsinged int num;
这个名字是不是有点长了,咱们能不能重新命个名字呢?答案是当然可以的
我们可以把unsigned int(类型)重命名为ui(开头首字母缩写),ui就是unsigned int的别名,这样写把代码复杂类型简单化。
2、关键字static
在C语言中:
static是用来修饰变量和函数的
①修饰局部变量 - 称为静态局部变量
②修饰全局变量 - 称为静态全局变量
③修饰函数 - 称为静态函数
①修饰局部变量
我现在写了这几行代码,那么问题来了,这个程序如果执行起来了,会在屏幕上打印什么呢?
Ctrl + F5让代码跑起来:
答案为10个1。为什么是10个1呢?
因为int a是个局部变量,进入作用域生命周期开始,出作用域生命周期结束。
这个在初识C语言2中讲过了(写文章-CSDN创作中心)
那如果我在变量a前加static结果还会是一样吗?那我们来看一下。
答案是1~10。为什么能输出这个结果呢?static修饰局部变量的作用是什么呢?
分析:第一个结果为1很好理解,可是第二个结果为2有没有发现第一次的结果并没有销毁。以此类推.....
那么static的本质是什么呢?我们来看看下面这幅图
栈区是进入作用域创建,出了作用域就会释放,放在静态区的数据创建后,直到程序结束才会释放。被static修饰都是在静态区里。堆区目前不做了解。
总结一下,普通的局部变量是放在栈区上的,这种局部变量进入作用域创建,出了作用域释放,但是局部变量被static修饰后,这种局部变量就放在了静态区,放在静态区的变量,创建好后,直到程序结束才释放。
本质:static的修饰改变了局部变量的存储位置,因为存储位置的差异,使得执行效果不一样。
注意:被static修饰是不影响作用域的!!!但是生命周期变长了。
②修饰全局变量
我们回顾一下全局变量,如果还有不懂的小伙伴可以点开后面的链接观看(写文章-CSDN创作中心)
若全局变量a被static修饰,结果又会是如何呢?
程序走起来发现报错了(无法解析的外部符号),所以为什么会出现这种现象呢?
原因是:全局变量本身是具有外部链接属性的,在一个文件中定义的变量,在另一个文件可以通过链接使用(extern),但是如果全局变量被static修饰,这个外部链接属性就变成了内部链接属性了,这个全局变量只能在自己所在的源文件内部使用。最终使得全局变量的作用域变小了。
③修饰函数
其实static修饰函数和修饰全局变量非常类似。让我们看看下面的代码。
如果还有不熟悉函数的小伙伴可以看看后面的链接(写文章-CSDN创作中心
那如果我在另一个源文件定义Add函数会怎么样呢?
其实这还是会报错,很明显这和全局变量非常相似,需要定义一个外部符号extern。
现在,我们在函数前加个static会怎么样呢?
结果是程序报错了(未定义外部符号),原因很简单,函数本身是具有外部链接属性的,被static修饰后,外部链接属性就变成内部链接属性,使得这个函数只能在自己所在源文件内部使用,其他源文件无法使用。和全局变量其实是一个道理。限制看作用域。
最后讲到这里,你是否对这两个关键字有所了解呢?