C语言 - 关键字static

全局变量和局部变量:在函数内部定义的变量是局部变量,在函数外部定义的变量是全局变量

作用域和生命周期的概念:

作用域:程序中标识符可以被使用的区域(范围),局部变量的作用域是它所在的局部范围,全局变量的作用域是整个工程

生命周期:变量由创建到销毁的一个时间段,局部变量生命周期由进入它的作用域开始到出了它的作用域结束,全局变量的生命周期是整个程序的生命周期

1.static修饰局部变量

代码1:

#include <stdio.h>

void test()
{
	int val = 0;
	val += 1;
	printf("%d ", val);
}
int main()
{
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		test();
	}
	return 0;
}

 代码2:

#include <stdio.h>

void test()
{
	static int val = 0;
	val += 1;
	printf("%d ", val);
}
int main()
{
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		test();
	}
	return 0;
}

代码1中val是局部变量,储存于栈区中,作用域是test函数内部,生命周期在出了这个函数时就结束了,因此每次调用test函数,都会重新定义val变量

代码2中val也是局部变量,作用域依然是test函数内部,但由于static修饰,储存在静态区而非占去中,它的生命周期被改变了,即使出了函数,val依然存在

2.static修饰全局变量

代码1:

val.c文件

int val = 5;

test.c文件

#include<stdio.h>
extern int val;
int main()
{
	printf("%d", val);
	return 0;
}

 代码2:

val.c文件

static int val = 5;

test.c文件

#include<stdio.h>
extern int val;
int main()
{
	printf("%d", val);
	return 0;
}

程序报错

代码1中val是全局变量,储存于静态区中,作用域是整个工程,生命周期是整个程序的生命周期,在其它源文件使用时需要extern声明

代码1中val是全局变量,由于被static修饰,作用域变为定义全局变量的源文件,本质上是将全局变量由外部链接属性变为内部链接属性,这时全局变量只能在本源文件使用,不允许从其他源文件访问

3.static修饰全局函数

代码1:

Add.c

int Add(int x, int y)
{
	return x + y;
}

test.c

#include<stdio.h>
extern int Add(int, int);
int main()
{
	int n1 = 1;
	int n2 = 2;
	int ret = Add(n1, n2);
	printf("%d", ret);
	return 0;
}

代码2:

Add.c

static int Add(int x, int y)
{
	return x + y;
}

test.c

#include<stdio.h>
extern int Add(int, int);
int main()
{
	int n1 = 1;
	int n2 = 2;
	int ret = Add(n1, n2);
	printf("%d", ret);
	return 0;
}

static修饰函数与修饰全局变量类似,函数具有外部链接属性,但被static修饰后,外部链接属性变为了内部链接属性,只能被本源文件使用,不允许其他源文件访问

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值