C语言 变量作用域 和 存储修饰符 static

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是一直在递增的并没有被销毁

好了就这么多啦!ヾ(◍°∇°◍)ノ゙

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值