赞
踩
目录
static是C语言的一个关键字,它是一个修饰符,既可以修饰变量,也可以修饰函数。
当static修饰以下内容时,我们通常称:
1.修饰局部变量---------称为静态局部变量
2.修饰全局变量---------称为静态全局变量
3.修饰函数---------------称为静态函数
1.可以改变变量的作用域或者生命周期。
2.使变量对外透明,程序员只能通过其对外的接口对变量进行操作,使程序安全性与保密性更强。
根据以下代码我们来体会static修饰局部变量的意义:
- #include<stdio.h>
- void fun()
- {
- //int a = 0; 不加static
- static int a=0; //加上static
- a++;
- printf("%d ", a);
- }
- int main()
- {
- int i = 0;
- for (i = 0; i < 10; i++)
- {
- fun();
- }
- return 0;
- }
运行程序,我们可以发现使用static与不使用static的结果不一样:
使用static:1 2 3 4 5 6 7 8 9 10
不使用static:0 0 0 0 0 0 0 0 0 0
如果只是单纯地在栈区声明一个局部变量,当fun函数执行结束后编译器就会自动释放a变量,当下一次进入fun()函数时重新创建并赋值;当我们加上了static修饰符,这个局部变量就被开辟到了静态区,不会随着fun()函数的结束而释放。
1.static修饰局部变量改变了变量的生命周期,使静态局部变量出了作用域依然存在。到程序结束,生命周期才结束。
2.static修饰局部变量不改变了变量的作用域,既无法在main函数内部使用a。
根据以下代码我们来体会static修饰全局变量的意义:
- //代码1,static.c
-
- extern int g_val;
- int main()
- {
- printf("%d\n", g_val);
- return 0;
- }
-
-
- //代码2,add.c
-
- int g_val=2022; //不加static;
- //static int g_val=2022; 加上static
当add.c文件中的全局变量g_val没有被static修饰,此时static.c通过extern声明这个外部变量,运行程序,程序输出:
2022
而当g_val被static修饰时,程序在编译时就会出现连接性错误,如下:

当我们定义一个全局变量时,它是具备外部链接属性的,而如果使用static修饰这个变量,就会将其的外部链接属性变为内部链接属性,从而无法在外部文件声明调用。
一个全局变量被static修饰,使得这个全局变量只能在本源文件使用,不能在其他源文件内使用,static改变了全局变量的作用域。
根据以下代码我们来体会static修饰函数的意义:
- //代码1,static.c
-
- extern int add(int x, int y);
- int main()
- {
- printf("%d\n", add(2, 3));
- return 0;
- }
-
-
-
- //代码2,add.c
- int add(int x, int y) //不加static
- {
- return x + y;
- }
-
- /*
- static int add(int x, int y) //加上static
- {
- return x + y;
- }
- */
当add.c文件中的add()函数没有被static修饰,此时static.c通过extern声明这个外部函数,运行程序,程序输出:
5
当add()函数被static修饰时,程序在编译时就会出现连接性错误,如下:

当我们定义一个函数时,它是具备外部链接属性的,而如果使用static修饰这个函数,就会将其的外部链接属性变为内部链接属性,从而无法在外部文件声明调用。
一个函数被static修饰,使得这个函数只能在本源文件使用,不能在其他源文件内使用
当我们在设计一些项目时,通常会因为保密性和安全性的原因,一些成员属性我们希望对程序员透明,不希望程序员可以直接修改这些成员属性。这时我们就可以将这些变量用static修饰使其不具备外部链接属性。而开发者通过设计一些对外的便捷接口供程序员进行使用,程序员通过调用这些接口来间接使用这些成员属性,使得一些细节被尽可能地隐藏起来。这就是我们所说的对程序进行封装。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。