代码分析:当i=0时,i <10为真,进入while循环,下来执行test();自定义函数。test函数中局部变量a的生命周期要开始了,紧接着创建a并赋值为1,接下来,a自增变为2,当执行完printf函数时。a的生命周期就结束了,就会把a的这块空间给销毁掉,还给操作系统。如此反复直到i>=10,循环结束,整个程序结束。最终代码运行结果如下图:
如果将上述代码中的int a = 1;改写为:static int a = 1;其余保持不变。得到结果如下图所示:
当执行第一次循环过后,a的值为2,但是当第二次循环过后a的值为3,那就说明在第二次调用test这个函数时,static int a = 1;并没有再次创建a,那么a的值是怎么来的,所以
如此看来只能有一种可能性,上一次出test函数范围的时候,a没有被销毁,正因为没有销毁,所以下一次进函数里面也没有被创建,还是保留着上一次留下来的值。根据结果可以推测出:每一次调用test函数,使用的a都是上一次函数调用留下的a。知道static大概的用法,知其然知其所以然,因此我们再来进行深度剖析。看下图,学习C语言我们比较关注这三个区,每个区各自存放的东西是不一样的。从下图可以看出,我们的静态变量就是存放在静态区的。所以当我们的局部变量a被static修饰之后,它就会变成静态局部变量,属于静态变量。综上可以得出,static修饰局部变量的时候,其实是改变了变量的存储类型(栈区存储->静态区),从而是的静态的局部变量出了自己的作用域也不会销毁,其实相当于局部变量的生命周期。
结论:
static修饰局部变量改变了变量的生命周期
让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
上例是static修饰局部变量,那它修饰全局变量呢?
先看个例子:
我们在原来的基础上创建了一个add文件,在add中定义一个全局变量g_val,但是代码运行后会报错。如果想要在原基础上实现效果,可以稍作修改。在其他文件中引用全局变量时,需添加extern修饰符进行变量声明,表示“引用外部定义的变量”。
那么当static修饰全局变量g_val呢?代码如下图:
从上图中可以看出,当static修饰全局变量g_val后,代码运行后会报错。由此我们可以这样理解:一个全局变量在整个工程的其他文件内部被使用,是因为全局变量具有外部链接属性,当一个全局变量被static修饰的时候,这个变量的外部链接就变成了内部连接属性,使得这个全局变量只能在自己所在的源文件内部使用,其他文件不能再使用,给我们的感觉是作用域变小了,但是它的生命周期没有发生任何变化。
需要注意的是,三种静态持续变量具有不同的链接性。全局变量具有外部链接性,静态全局变量具有内部链接性,静态局部变量没有链接性。即在其他文件中可以引用当前文件定义的全局变量,但静态全局变量和静态局部变量只能在当前文件中使用。
接下来,我们来讨论static修饰函数。代码如下图:
代码结果和我们预想的一样,结果是30。这就说明了函数也是具有外部链接属性的。下来我同样用static修饰add函数,是不是似曾相识,和上面我们讨论static修饰全局变量出现了一样的错误。我们也可以推测出来,函数也是具有外部链接属性的。
结论:static修饰函数的时候,函数本来也是具有外部链接属性的,被static修饰的时候,就变成了内部链接属性,这个函数只能在自己所在的源文件内部使用,不能在其他文件内部使用,给我们的感觉是改变了作用域~
12、#define定义常量和宏
示例代码:#define定义标识符常量
?#define定义宏:
13、指针
13.1 内存
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
我们可以画图来形象的表示:
?再看示例代码:
a是int型,在内存里面占四个字节。那么a的地址是什么呢?其实a的地址就是它所占这四个字节的第一个字节的地址,因为我们只要知道了它的值起始地址,后面的地址就都能知道了。如下图所示:
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。
取出变量地址如下:
#include <stdio.h>
int main()
{
int n = 10;
&n; //取出n的地址
//注:这里n的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
printf("%p\n", &n);//打印地址,%p是以地址的形式打印,地址是以16进制显示的
return 0;
}
那地址如何存储,需要定义指针变量。
int num = 10;
int *p;? //p为一个整形指针变量
p = &num;
?
?