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

静态变量Static Variables)和实例变量(Instance Variables)是面向对象编程中关于内存分配和生命周期的概念,它们的区别主要体现在以下几个方面: 1. **内存分配**: - 实例变量:每个对象都有自己的副本,当创建对象时自动分配内存空间,称为对象的成员变量。 - 静态变量:只有一份,属于整个类而不是特定的对象,所有对象共享同一块内存。 2. **生命周期**: - 实例变量:随着对象的创建而存在,对象消失时,实例变量也随之销毁。 - 静态变量:存在于类的整个生命周期内,直到程序结束才释放。 3. **访问权限**: - 实例变量:如果没有特别说明,默认在一个类的范围内有效,通过对象的引用进行访问。 - 静态变量:可以直接通过类名来访问,无需创建对象即可使用,也可以通过类的对象访问。 4. **初始化**: - 实例变量:通常在构造函数中初始化,每个对象有自己的初始化值。 - 静态变量:一般在类加载时就初始化,所有对象共享同样的初始值。 5. **多线程情况**: - 实例变量:对于多线程环境,每个对象的实例变量有自己的独立副本,互不影响。 - 静态变量:全局共享,可能会导致线程安全问题,需额外关注并发控制。 总之,实例变量是为了满足对象状态的个性化需求,而静态变量则是为了节省内存并提供类级的常量或共享资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值