关键字static

目录

修饰局部变量 

修饰全局变量 

修饰函数 


在C语言中:

    static是用来修饰变量和函数的

  1. 修饰局部变量 -- 称为静态局部变量
  2. 修饰全局变量 -- 称为静态全局变量
  3. 修饰函数 -- 称为静态函数 

    修饰局部变量 

代码1(无static修饰)---- 输出结果为10个1

#include<stdio.h>
void test() {
    int i = 0;
	i++;
	printf("%d", i);
}
int main() {
	int i = 0;
	for (i = 0; i < 10; i++) {
		test();
	}
	return 0;
}

代码2(有static修饰)---- 输出结果为12345678910

#include<stdio.h>
void test() {
    static int i = 0; //static修饰局部变量
	i++;
	printf("%d", i);
}
int main() {
	int i = 0;
	for (i = 0; i < 10; i++) {
		test();
	}
	return 0;
}

结论:

  1. 普通的局部变量是放在内存的栈区上的,进入局部范围,变量创建,除了局部范围变量销毁。
  2. 当static修饰局部变量时,局部变量是在静态区开辟空间的,这时局部变量出了作用域,变量不销毁,下次进去作用域使用的是上一次遗留的数据,改变了存储位置(由栈区到静态区),使得变量的生命周期发生了变化

修饰全局变量 

代码1 (无static修饰)

//分别建立两个源文件
//add.c 源文件1
int g_val = 2022; 

//test.c 源文件2
extern int g_val //声明外部符号
int main() {
	printf("%d\n", g_val);
	return 0;
}

代码2 (有static修饰)

//分别建立两个源文件
//add.c 源文件1
static int g_val = 2022; 

//test.c 源文件2
extern int g_val //声明外部符号
int main() {
	printf("%d\n", g_val);
	return 0;
}

代码1正常,代码2在编译时会出现连接性错误。

结论:

  • 全局变量是具有外部链接属性的,如果全局变量被static修饰,外部链接属性就变成了内部链接属性,其他源文件就无法通过链接找到这个符号。

修饰函数 

代码1(无static修饰) 

//建立两个源文件
//Add.c 源文件1
int Add1(int x, int y) {
	return x + y;
}

//test.c 源文件2
extern int Add1(int, int); //声明外部符号
int main() {
	printf("%d\n", Add1(2, 3));
	return 0;
}

代码2(有static修饰) 

//建立两个源文件
//Add.c 源文件1
static int Add1(int x, int y) {
	return x + y;
}

//test.c 源文件2
extern int Add1(int, int); //声明外部符号
int main() {
	printf("%d\n", Add1(2, 3));
	return 0;
}

 代码1正常,代码2在编译时候会出现连接性错误

结论:

  • 函数具有外部链接属性,其他源文件想使用函数,需要正确的声明就可以。
  • 但被static修饰,外部链接属性就变成了内部链接属性,这个时候函数只能在自己所在的.c文件内部使用,不能在外部使用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值