🔗 必看参考-C语言关键字static的使用详解
1> 解决:重复定义问题
文件: main.h
#ifndef __MAIN_H__
#define __MAIN_H__
int add;
void test(void);
#endif
文件: main.c
#include "main.h"
int main(void)
{
int a = 1;
int b = 1;
add = a + b;
test();
return 0;
}
文件: fff.c
#include "main.h"
#include <stdio.h>
void test(void)
{
printf("add = d%", add);
}
编译后报警:symbol add multiply defined
2> 定义和声明
2.1> 定义
注意:定义只能定义【1】次, 声明可以多次声明;
2.2> 声明
- 给编译器说要使用一个对象, 对象包含:1》函数,2》局部变量; 3》全局变量;
- 这个对象在其他文件已定义;
2.3> 函数的定义和声明
文件:main.c
# include <stdio.h>
void fun(void);
extern void fun(void);
int main()
{
fun();
return 0;
}
void fun()
{
printf("Hello!")
}
void fun()
{
printf("Hello!")
}
2.4> 局部变量定义和声明
文件:main.c
int main()
{
int a = 1;
int a;
return 0;
}
2.5> 全局变量定义和声明
文件:main.c
#include <stdio.hj>
extern int a;
int main()
{
printf("a = d%", a);
return 0;
}
int a = 10;
3> 变量作用域
3.1> 全局变量作用域
位置:在函数外定义; 作用域:从定义处到所在文件结束;
文件:main.c
#include <stdio.h>
int a = 10;
int main()
{
return 0;
}
3.2> 局变量:4个作用域
位置:在函数内定义; 作用域:局限下函数内; 1》 形式参数 :作用域:整个函数体; 2》 函数体中定义变量;作用域:定义处至函数结束; 3》 for语句中定义变量;作用域:整个for语句; 4》 语句块中定义变量:作用域:定义处至该语句块结束;
文件:main.c
#include <stdio.h>
int main()
{
int a = 2;
for (int i=0; i<10; i++)
{
}
{
int b = 6;
}
return 0;
}
void fun(int formal)
{
}
4> 作用域改变
4.1> extern: 扩展全局变量作用域
4.1.1> 同一个文件扩展
#include <stdio.h>
void fun()
{
extern int a;
printf("a = d% \n", a);
}
int a = 10;
int main()
{
fun();
return 0;
}
4.1.2> 多个文件扩展
#include <stdio.h>
extern int a;
void fun()
{
printf("a = d% \n", a);
}
int main()
{
fun();
return 0;
}
#include <stdio.h>
int a = 10;
4.2> extern: 扩展函数作用域
4.3> static: 限定全局变量作用域
#include <stdio.h>
extern int a;
void fun()
{
printf("a = d% \n", a);
}
int main()
{
fun();
return 0;
}
#include <stdio.h>
static int a = 10;
4.4> static: 限定函数作用域
5> 变量的存储方式
5.1> 静态存储
整个程序运行过程中存在; 如:全局变量
5.2> 动态存储
在程序运行过程中某一时间段存在; 局部变量:使用时分配空间,出作用域就释放空间;
5.3> static: 改变局部变量存储方式为静态存储
静态局部变量,初始化只初始化一次;
#include <stdio.h>
void fun()
{
int a = 0;
a++;
printf("a = d%\n", a);
}
int main()
{
for(int i=0; i<3; i++) {
fun();
}
return 0;
}
运行结果: a = 1; a = 1; a = 1;
加static:
#include <stdio.h>
void fun()
{
static int a = 0;
a= a + 1;
printf("a = d%\n", a);
}
int main()
{
for(int i=0; i<3; i++) {
fun();
}
return 0;
}
运行结果: a = 1; a = 2; a = 3;
|