栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

初识C语言之——static修饰变量及函数的认知。

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

初识C语言之——static修饰变量及函数的认知。

         static——C语言中考题常见的关键字 

在c语言中:static是用来修饰变量和函数。

我们可以先从字面意思来理解,即“静态的,静止的”。

以至于它的修饰作用就有如下三个作用。

1,static修饰局部变量——称为静态局部变量

2,static修饰全局变量——称为静态全局变量

3,static修饰函数——称为静态函数

  一,      我们来以代码来介绍第一点——修饰局部变量。

先来看一段基础代码:

​
#include

void print()
{
    int num = 0;
    num += 1;
    printf("%d ", num);
}
int main()
{

    int i = 0;
    for (i = 0; i < 10; i++)
    {
        print();
    }
    return 0;
}

 再看一段用static修饰的代码。

#include
void print()
{
	static num = 0;
	num += 1;
	printf("%d ", num);
}
int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		print();
	}
	return 0;
}

运行的结果如下:

         很容易能理解,如果没有static来修饰这个局部变量num,那num的作用域只是在print函数的代码块里,作用域也就是该函数内,可static修饰后,导致结果由十个1变成了1到10。

这是为什么呢 ?

        局部变量,是有其作用域的,作用域就在创建变量的代码块内,在它自己的作用域中,可以一直占据内存且不销毁,可一旦出了所在的作用域,就会销毁该局部变量,再次进入会重新创建。所以就第一段代码而言,每次出print函数都会销毁num变量的数值,所以打印结果是十个1。

而要解释第二个程序的成因,就要涉及到计算机内存的相关划分

         见上图,内存可大致分为栈区,堆区,静态区三部分。而定义一个变量,就要向内存申请一片空间来储存,储存的区域就是这三个区域。

        其中,栈区中变量的的特点是,变量在进范围后可被创建,但出范围后就销毁,常见的变量是1.局部变量  2.函数的参数

        而静态区存放的有1.全局变量和2.静态变量,特点是只有在出了整个程序,变量才会被销毁。

这也就印证了局部变量的性质——进作用域创建,出作用域即销毁。

        而在用static修饰局部变量后,变量出了作用域却不销毁,是因为static将局部变量变成了静态区的静态变量,导致此时的局部变量不再出作用域就销毁,也就是。

        static改变了原局部变量的储存类型(由栈区变为静态区)进而增长了它的生命周期。 导致程序结束才被会销毁,并且收回静态变量的空间。

        (可以当自己不想变量被销毁而继续保存时使用static)

二,static修饰全局变量

我们先在vs编译器中新建两个.c源文件。 

 在practice1中创建一个全局变量year。当我们想在practice中使用这个year变量时,只需要使用关键字extern即可,也就是

 这样程序就可以正常进行不会报错。

而当用static修饰practice1中的全局变量时,就会出现如下情况:

 出现左下角的报错情况,因为extern是声明外部符号的,用来解析外部符号用,只要声明后,就可以将原文件a中的全局变量用在源文件b中使用,而当用static修饰这个变量之后就会解析错误。这是为什么呢?

        因为c语言语法规定,全局变量具有外部链接属性,只要有合适的链接,就可以将本源文件的全局变量应用于其他的源文件中使用(例如使用关键字extern就可调用外部文件的全局变量)。一旦加上static修饰全局变量时,会导致被修饰的全局变量的外部链接属性变成了内部链接属性——导致这个变量只能在自己所在的.c文件中看到并使用,其他.c文件中无法使用。

        (让该变量不想被别人看到并使用,就可以采用这种办法)

三,static修饰函数

static修饰函数时,与修饰全局变量及其相似,懂了的小伙伴看这块儿会更加轻易理解并深刻记忆

我们先来看下图

 

我们在practice1中定义ADD函数,然后如上办法用extern在practice中声明该ADD函数并且在practice中使用函数,我们可知,这是正确并且成立的。而当用static修饰ADD函数时,就是与修饰全局变量类似的如下结果:

 

 与static修饰全局变量一样,会出现左下角报错提示

原因同static修饰全局变量大同小异——函数本身具有外部链接属性,即可以在a文件定义,由适当的链接后可以在b文件中使用(例如使用关键字extern就可调用外部文件的ADD函数),而一旦加上static修饰函数时,会导致被修饰的函数的外部链接属性变成了内部链接属性——导致这个函数只能在自己所在的.c文件中看到并使用,其他.c文件中无法使用。

(不希望自己辛辛苦苦造就的函数被别人使用并知晓原理就可以这么做哦)

这便是小编对于c语言中static的认识,希望多多支持。

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1019665.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号