C语言变量的作用域可以分为三种,分别是
块作用域:块作用域就是一对花括号括起来的代码
函数作用域:从形参定义到原型声明
文件作用域:从文件创建到结尾
如下定义各个变量
int main(void)
{
int stay = 30;//作用于整个main函数块
printf("stay at out: %d\n",stay);
printf("stay at out: %p\n",&stay);
{
int stay = 50;
printf("stay at in: %d\n",stay);//只作用于这个花括号 并且会屏蔽上面的相同的变量
printf("stay at in: %p\n",&stay);
}
while(stay++ < 33) //这是块作用域中的stay
{
int stay = 100;
stay++;
printf("stay at while: %d\n",stay); //作用于while内部的stay
printf("stay at while: %p\n",&stay);
}
printf("stay at out: %d\n",stay);
printf("stay at out: %p\n",&stay);
system("pause");
return 0;
}
如上我们可以执行打印出变量看一下
如上所示 第一次打印的是main函数中的变量
然后第二次打印的是花括号中函数的变量 并且地址与main函数中变量的地址不同
第三次while中变量 一共经历了三次循环 也经历了三次 创建 stay这个变量并且销毁 所以while内的stay 的值一直保持在101
static
首先要理解 三个概念 堆区 栈区 静态区
静态数据区: 在编译器进行编译的时候就为该变量分配的内存,即全局变量和静态变量(用static声明的变量),存放在这个区的数据程序全部执行结束后系统自动释放,声明周期贯穿于整个程序执行过程。全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域(.data),未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(.bss)。
堆区:这部分存储空间完全由程序员自己负责管理,它的分配和释放都由程序员自己负责。这个区是唯一一个可以由程序员自己决定变量生存 期的区间。可以用malloc,new申请对内存,并通过free和delete释放空间。
栈区:存放函数的形式参数和局部变量,由编译器分配和自动释放,函数执行完后,局部变量和形参占用的空间会自动被释放。效率比较高,但是分配的容量很有限。
这里我们定义一个函数并在其里面使用static声明一个变量如下
void static_test(void)
{
int test1 = 1;
static test2 = 1;
++test1;
++test2;
printf("test1 is: %d\n",test1);
printf("test1 is: %p\n",&test1);
printf("test2 is: %d\n",test2);
printf("test2 is: %p\n",&test2);
}
然后我们设置一个循环
for(int i = 0;i < 3;++i)
static_test();
执行一下看
可以看出 test2是一直在递增的并没有被销毁
好了就这么多啦!ヾ(◍°∇°◍)ノ゙