第十三课 作用域与生存周期
1.引用一个变量时要注意两点,一点是注意变量是否存在,也就是有没有被定义,第二点是变量的作用范围。
2定义一个变量,就是为变量分配空间。引用变量就是引用变量内容。
比如:int i=1;
定义了一个整形变量i。编译器会为它分配一个地址(空间)用来存放i,由于是int型的变量,所以是4个字节。里面存放了一个数字1,这个1就是变量的内容。
引用变量:比如j=i,就是把i的值赋给了j,j=1;
二。作用域。
比如在这个函数中,我在main里定义一个i 变量,这个i可以在main中使用,但是在getsecond函数中不能使用,同理,在getsecond中定义一个变量,main函数中也不能使用。
在main中的i,能够使用的范围是有限,他的存在范围叫做作用域,所谓作用域就是变量能够被引用的范围。
定义在函数中的变量叫做局部变量,他只能在局部范围内使用,一般来件,在函数中定义的变量的作用域是从定义开始到本函数结束。
即使在main中,如果在定义i的前面使用i,也是有问题的。
ps:同一作用域内不允许出现同名现象,不如在main中,如果已经有了int i=1,那么就不允许出现第二次定义i。
2.既然存在局部变量,也就存在全局变量,所谓的全局变量就是在函数外定义的变量。
在这两张图中可以看出,j声明在函数之外,所以两个函数都可以引用到,这样的变量叫做全局变量。
这个程序和上面有些不同,在main中int j=1,而在外部有一个全局变量int j=0,但是最后没有出错,输出j=1.这是因为两个j不再同一个作用域中。
3.生命周期
变量分为两种,一种为动态变量,一种为静态变量。
一般我们省略不写动态变量,比如声明一个整形变量int i;实际上他是动态变量,auto int i;
这样的变量在函数运行时分配空间,在函数结束时就会释放。
还有一种静态变量,声明方式为static int i;他从程序运行开始分配空间,程序结束后被释放。
比如:
在这个程序中,fun函数定义了两个变量,i为静态变量,j为动态变量。
在main中调用函数,每次调用函数i和j都会自加1,但是j却不会变化,而i却在变化,这是因为两种变量的生命周期不同。
动态变量会在函数使用完毕之后释放,而动态变量在程序结束之后才会释放,函数结束时它仍然存在。
4.分配空间
程序运行需要给函数分配空间,空间分为三种,1.动态区,2静态区,3堆区(程序员区)。
动态变量分配在动态区,静态变量分配在静态区。
动态区在函数编译结束就会被释放,静态区在程序结束后才会被释放。
PS:全局变量时静态变量,被分配在静态区。