static(静态)变量有什么作用?

在C语言中,关键字static的意思是静态,他的主要作用有两个:

1.在函数体内
静态变量具有“记忆”功能,即一个被声明为静态的变量只会被初始化一次,该函数在调用过程中,其值保持不变。一个变量被定义为静态变量就会将其放到静态数据区,而不是栈区。
也就是说一个静态变量只有在声明时对其进行一次出初始化,如果声明时未对其进行赋值操作:
静态整型默认为0‘’
静态字符默认为空;
下面来看一个例子

void add()
{
    static int a = 0;    //定义一个静态整型a,并对其初始化为0
    a++;                            //a自加1
    printf("%d\n",a);
}
1
2
3
4
5
6
在调用该函数两次,a的值输出如下:
可以看到,首次调用该函数时静态变量a初始化为0,随后a自加1,输出结果为a的值为1;
在第二次调用时,a的值保持不变,不再对其进行初始化,此时a的值为1,随后进行自加操作,输出a的值为2。

2.在文件内(在函数体外)
在文件内,静态函数/变量用来限制其作用域为本文件内。
即如果一个变量被声明为静态的,那么该变量可以被当前文件内的所有函数访问,但不能被其他文件中的函数访问。他是一个本地的全局变量,且只会被初始化一次。
如果一个函数被声明为静态的,那么该函数与普通函数的作用域不同,其作用域仅在当前文件中,也就是说他只可以被本文件的其他函数调用,而不可以被本文件以外的其他函数调用
下面先展示一下分文件编程时正常调用:
part.h

#include <stdio.h>
void print(void);
1
2
part.c

#include "part.h"
void print(void)
{
        printf("hello world\n");
}
1
2
3
4
5
main.c

#include "part.h"

int main()
{
        print();
        return 0;
}

1
2
3
4
5
6
7
8
在本例中,part.c 文件中的打印函数被调用并执行打印操作,因为其为普通函数,并没有作用域限制,所以可以打印出“hello world”
当把打印函数定义为静态函数时,当其他文件的函数调用他时的例子:

part.c

#include "part.h"
static void print(void)
{
        printf("hello world\n");
}
1
2
3
4
5
因为定义打印函数为静态函数,此时限制其作用域为当前文件内,当其他文件的函数调用该函数时出现报错

可以看到报错内容为:print函数但使用但并未被定义,即静态函数不可被其他文件的函数调用。
对于文件内的静态函数,主要记住其作用域为当前文件,不可被其他文件的函数访问。但是这可不够,其他文件的函数不知道你,本文件的函数可以访问你,如果该函数又是普通函数,可以被其他文件的函数调用,会出现什么样的情况呢?
part.c

#include "part.h"
static int a = 0;
void add(void)
{
        a++;
        printf("%d\n",a);
}
1
2
3
4
5
6
7
仍然在主函数中调用,编译可以通过,让我们来运行下看是什么结果呢

可以看到,通过调用普通函数的方式是可以访问该文件内的静态变量的

总结
对于关键字static关键字的作用,可以从以下两点来记忆
1.当在函数修饰静态变量时,其具有记忆功能,只初始化一次,所在函数再次被调用时静态变量的值保持上次的值不变
2.当在文件内时,修饰的变量和函数作用域均被限制在该函数内,在其他文件内的函数调用时会出现“不认识”的情况,不可被访问和调用。
————————————————
版权声明:本文为CSDN博主「畜牧场不看动漫」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_46417372/article/details/124249859

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值