C语言入门知识点(7.1函数补充)(超详细)


对于函数的一些补充


在这里插入图片描述

8.3static和extern

staticextern都是C语言中的关键字。
static静态的 的意思,可以用来:

  • 修饰局部变量
  • 修饰全局变量
  • 修饰函数

extern是用来声明外部符号的。

在了解这两个关键字之前,先来了解一下作用域和生命周期。

**作用域(scope)**是程序设计概念,通俗来说就是一个名称的适用范围就是这个名称的作用域。

  • 局部变量的作用域是变量所在的局部范围
  • 全局变量的作用域是整个工程(项目)

生命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的一个时间段。

  • 局部变量的生命周期:进入作用域创建变量,生命周期开始,出作用域生命周期结束。
  • 全局变量的生命周期:整个程序的生命周期
8.3.1static修饰局部变量

先来看两段代码:

//不用static修饰
#include <stdio.h>

void test()
{
	int a = 1;
	a++;
	printf("%d ", a);
	return;
}

int main()
{
	int i = 0;
	for (i = 0;i < 5;i++)
		test();
	return 0;
}

运行结果
在这里插入图片描述

//用static修饰
#include <stdio.h>

void test()
{
	static int a = 1;
	a++;
	printf("%d ", a);
	return;
}

int main()
{
	int i = 0;
	for (i = 0;i < 5;i++)
		test();
	return 0;
}

运行结果
在这里插入图片描述

为什么会造成两种运行结果的不统一呢?

我们先来了解一下内存是如何储存的

栈区堆区静态区
局部变量、函数参数动态内存管理全局变量、静态变量

这是内存内部的一部分结构

  • 在未使用static修饰的时候,a这个变量是储存在栈区里面的,每次函数循环重新创建变量a
  • 在使用static修饰的时候,a这个变量变成了静态变量,储存在静态区,重新进入函数不会重新创建变量a

结论
static修饰局部变量改变了变量的⽣命周期,⽣命周期改变的本质是改变了变量的存储类型,本来⼀个局部变量是存储在内存的栈区的,但是被 static 修饰后存储到了静态区。存储在静态区的变
量和全局变量是⼀样的,⽣命周期就和程序的⽣命周期⼀样了,只有程序结束,变量才销毁,内存才回收。但是作⽤域是不变的

8.3.2static修饰全局变量

如图1:
将初始化和函数主体放到两个文件中,用extern进行声明,不使用static来修饰全局变量
在这里插入图片描述

extern是⽤来声明外部符号的,如果⼀个全局的符号在A⽂件中定义的,在B⽂件中想使⽤,就可以使⽤extern 进⾏声明,然后使⽤。

如图2:
将初始化和函数主体放到两个文件中,用extern进行声明,使用static来修饰全局变量
在这里插入图片描述

结论
如我们所见,使用static修饰全局变量以后,这个全局变量就只能在本文件内部使用了。这其实是因为全局变量本来是有外部链接属性的,而添加了static以后变成了内部连接属性,就只能在本文件内部使用了,其他文件即使声明以后也不能使用。

8.3.3static修饰函数

static修饰函数和static修饰全局变量是很类似的,因为函数本身也有外部连接属性,下面我们来看例子:

如图1:
将函数的定义和调用放到两个文件中,用extern进行声明,不使用static来修饰全局变量
在这里插入图片描述

如图2:
将函数的定义和调用放到两个文件中,用extern进行声明,使用static来修饰全局变量
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值