关于一些static修饰问题

本文探讨了C语言中static关键字的作用,解释了它如何改变局部变量和全局变量的生命周期及存储区域。当static修饰局部变量时,变量的生命周期延长,保持其之前的状态,体现出记忆性。对于全局变量和函数,static使其由外部链接变为内部链接,限制了它们的作用范围。文章通过示例代码展示了这些概念的应用及其影响。
摘要由CSDN通过智能技术生成

“static”在英文的解释中意为“静止的,停止的”,而当它放在计算机语言中它意为“静态”,那么当用这个关键字去修饰一些变量时会发生什么呢?这就是一个非常有意思的问题

1.修饰局部变量时

a.生命周期延长

        我们都知道任何一个变量都是有自己的作用范围以及自己的生命周期,一旦出了他自己的领域那么它就会原地爆炸,不复存在(哈哈),而当它碰到了神之关键字“static”,那么它的结局就会不一样了!下面我们来看这两段代码

#include <stdio.h>
int sum(int a)
{
    int c = 0;
    int b = 2;
    c += 3;
    b += 2;
    return (a + b + c);
}
int main()
{
    int i;
    int a = 3;
    for (i = 0; i < 3; i++) 
    { 
        printf("%d,", sum(a)); 
    } 
    return 0;
} 

 这段代码运行的结果为10 10 10

而当我们用static去修饰调用函数里的变量b时,会有什么结果呢?

#include <stdio.h>
int sum(int a)
{
    int c = 0;
    static int b = 2;
    c += 3;
    b += 2;
    return (a + b + c);
}
int main()
{
    int i;
    int a = 3;
    for (i = 0; i < 3; i++) 
    { 
        printf("%d,", sum(a)); 
    } 
    return 0;
} 

这段代码的结果为 10 12 14

以上结果可以放在编译器中验证那为何会有这两种差异呢?实际上就是static捣的鬼,当它修饰变量b时,感觉是使得b的生命周期变长了,即使修饰的局部变量出了作用域也不会被销毁,依然保持上一次的值,这也体现了static修饰局部变量时具有记忆性!其实在本质上来说static修饰局部变量时候,改变了储存位置(从栈区变到静态区)

2.修饰全局变量与函数

        我们知道全局变量和函数都具有外部链接的属性(可以跨文件使用),那么当我用static去修饰时又会发生什么?在看代码

//代码1
//add.c
int dal=2;

//test.c
extern int dal=2;//当我们要引用外部文件时要加上extern
int main()
{
    printf("%d",dal);
    return 0;
}
 
//代码2
//add.c
static int dal=2;

//test.c
extern int dal=2;
int main()
{
    printf("%d",dal);
    return 0;
}
//代码1结果为2,代码2运行错误

//以下是关于修饰函数的验证

//代码3
//add.c
int add(int x,int y)
{
    return x+y;
}

//test.c
extern int add(int x,int y)//
int main()
{
    int a=10;
    int b=20;
    int z=add(a,b);
    printf("%d",z);
}

//代码4
//add.c
static int add(int x,int y)
{
    return x+y;
}

//test.c
extern int add(int x,int y)
int main()
{
    int a=10;
    int b=20;
    int z=add(a,b);
    printf("%d",z);
}
//代码3的结果是30,代码4错误

从以上代码可以看出当static修饰函数与全局变量时,两者的结局都是一致的,使得一个具有外部链接属性的一个东西变成了一个具有内部属性的东西,这就好像是把我原本失去的东西给夺回来,挽回自己那“该死的温柔

好了,以上是本人晚上“梦到的内容",希望各位看官能留下你们英明的指导!感谢支持~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值