关键字Static在C语言中的用法——修饰变量和函数

   

目录

   

一、修饰局部变量——称为静态局部变量

二、修饰全局变量——称为静态全局变量

三、static修饰函数——称为全局函数


一、修饰局部变量——称为静态局部变量

        这里小编直接借助代码带着大家学习吧!大家先看到下面这个代码,我们很容易发现,下面这个while循环将会执行十次对吧,循环体会执行十次,也就是里面的test函数会被调用十次。

#include
int main()
{
    int i = 0;
    while(i < 10)
    {
        test();
        i++;
    }
    return 0;
}

        紧接着,我们来写一下这个test函数,我们会发现我们不需要这个函数返回任何东西,所以类型就定为viod,也就不需要return来返回值了。这个函数的意思就是,我们每一次调用这个函数,进去之后,a被赋值为5,然后a+1,最后打印出来,我们会发现最后我们的屏幕上打印出来的是十个6.也就是说,每次调用这个函数后,就会重新开辟一块空间来给a并且赋值为5.

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

        然后,当我们用static来修饰这个变量a的之后,会发生什么样的变化呢,我们会看见打印到屏幕上是6到15。是不是产生了累计的效果呀。

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

 

         那是如何得到如上效果的呢,其实当我们用static修饰变量a之后,我们在第一次调用完test函数后,这个变量a没有被销毁,而是以6的形式继续存在test函数中,当第二次调用test函数时,我们没有去重新创建a,而是继续使用上次保留的a=6。从而产生如上效果。那么有人会问,那这个a所占用的这个空间什么时候会还给操作系统呢(或者说a什么时候销毁呢)。那么小编这里告诉你,当整个程序结束后,我们的a才会被销毁。

        紧接着,小编为了让大家理解的更透彻,来为大家更深入的讲一讲static到底是怎么实现如上操作的。

        在C语言中,我们把内存大概划分为三个区域,①栈区②堆区③静态区,如下如图所示

关键字Static在C语言中的用法——修饰变量和函数_第1张图片

 也就是说,static所修饰的局部变量a就成为了静态变量,也就从栈区转移存储放在静态区了。

这使得它存储类型发生变化,总结来说:static修饰局部变量改变了变量的存储类型,其实是改变了它的位置,最终使得这个静态变量生命周期变长了,直到程序结束,生命周期才结束。(注意:作用域没有边,还是在所在的那个函数里面)

二、修饰全局变量——称为静态全局变量

        我们知道C语言里面可以创建多个源文件,并且可以跨文件。如下图,我们在左边源文件创建一个全局变量,然后在右边声明一下,然后引用并打印。

关键字Static在C语言中的用法——修饰变量和函数_第2张图片

这里表明全局变量具有外部链接属性(只需要声明一下即可),所以在其他源文件内部依然可以使用。接下来,我们对这个全局变量使用static进行修饰,然后再来运行一下,我们会发现报错,提示我们有无法解析的外部符号‘g_val’。(如下图)

关键字Static在C语言中的用法——修饰变量和函数_第3张图片

也就是在这个时候,右边的源文件没有找到这个‘g_val’。原因其实就是因为这个static。也就说明,static修饰全局变量,改变了全局变量的链接属性,由外部链接属性变成内部链接属性。所谓内部链接属性,也就是只有在自己的文件中可以看见,也就是在左边add.c这个文件可以发现并使用,不能在其他源文件内部使用了 。这就是static修饰全局变量的作用。(感觉像是作用域变小了,但不影响存储位置,都在静态区。)

三、static修饰函数——称为全局函数

        static修饰函数和static修饰全局变量是一样的。如下代码,我们在左边写了一个Add函数,然后在右边声明了一下并且调用。

关键字Static在C语言中的用法——修饰变量和函数_第4张图片

 

 我们发现可以正常运行,接下来,我们把函数用static修饰一下,我们会发现和修饰全局变量一样,报错了。

 也就说明,函数也是具有外部链接属性的,但是被static修饰后,变成了内部链接属性。使得这个函数只能在自己所在的源文件内部使用,不能在别的源文件使用。这就是static修饰函数的作用,和修饰全局变量是一样的。

        那么到这里,static修饰局部变量、全局变量以及函数的作用就基本讲完了。如果有哪里讲的不好或者有问题的,欢迎大家来到评论区指出来。如果觉得小编讲的不错的,可以动下你们的小手,点个赞。如果想和小编继续一起学习,共同进步的,可以留下你们的关注。最后,谢谢大家的点赞和关注。

你可能感兴趣的:(c语言,c#)