带你熟知关键字static用法——C语言(举例及通俗易懂)

引入

  首先我们看两个例子:

例1

#include
void test()
{
    int i = 0;
	i++;
	printf("%d", i);
}
int main()
{
	int a = 0;
	while (a < 10)
	{
		test();
		a++;
	}
	return 0;
}

例2

#include
void test()
{
	static int i = 0;
	i++;
	printf("%d", i);
}
int main()
{
	int a = 0;
	while (a < 10)
	{
		test();
		a++;
	}
	return 0;
}

   那么请问例1和例2的输出结果一样吗?答案是肯定不一样的。我们来看一下例1和例2分别输出的结果。

带你熟知关键字static用法——C语言(举例及通俗易懂)_第1张图片

   为什么两个的输出结果不一样的,原因就是在static修饰了局部变量。接下来我们仔细分析一下原因。

一、static的简单认识

  1. 在c语言中,static是一个常见的关键字 可用来修饰。
  2. static可修饰局部变量、全局变量、自定义函数。

二、static的具体用法

1、static修饰局部变量

  从刚开始我们引入的两个例子可以发现,例2中static修饰了局部变量。而修饰局部变量有什么意义呢?首先我们先来了解一下局部变量、静态变量等在内存中所储存的位置。

                                       带你熟知关键字static用法——C语言(举例及通俗易懂)_第2张图片

  我们都知道,局部变量进去作用域时创建,出了作用域就自动释放了。这也是例1打印出来10的一的原因。但是当static修饰局部变量时,例2中的局部变量a就变成了静态变量,放在了静态区。放在静态区的数据创建后直到整个程序结束才释放。例2中当第一次调用完test函数后,第二次调用时,a此时的值为1,同时不会执行static int =0语句,而是直接执行a++语句。

总结:

  1. static修饰局部变量,局部变量变成静态变量,从而放在静态区。静态区的变量从创建后直到整个程序结束之后才释放。
  2. 通俗来讲,static修饰局部变量是改变了局部变量的生命周期,使其生命周期变长。
  3. 本质来讲,static修饰局部变量是改变了局部变量的储存位置。
  4. 注意static修饰局部变量,是改变了局部变量的生命周期,而不是作用域。  

 2、static修饰全局变量

  全局变量本身就具有的属性是外部链接属性。在不同的源文件中,要引用其他源文件的全局变量,只需要用extern关键字就行。但是当我们用static修饰全局变量后,在另一个源文件中引用时就会发现找不到外部符号,也就是不能再引用。如下图:

带你熟知关键字static用法——C语言(举例及通俗易懂)_第3张图片

 总结:

  1. static修饰全局变量,使全局变量不在有外部连接属性。
  2. 通俗来讲,static修饰全局变量后,使全局变量只能在自己所在的源文件中使用,不能被其他源文件通过extern链接使用。
  3. static修饰全局变量使其作用域变小。

3、static修饰函数

  函数本身也是具有外部链接属性的。 在不同的源文件中,可以通过extern来引用其他源文件的函数。但是当static修饰函数时,其他源文件就不能过再引用。也就是使函数的外部链接属性变成了內部链接属性。

带你熟知关键字static用法——C语言(举例及通俗易懂)_第4张图片

 总结:

  1. static修饰函数,使函数不在有外部连接属性。
  2. 通俗来讲,static修饰函数后,使函数只能在自己所在的源文件中使用,不能被其他源文件通过extern链接使用。

 结尾

  综上我们可以看出,static的作用还是挺大的。static修饰局部变量、全局变量、自定义函数时意义分别也是不同的。但是修饰全局变量、自定义函数时较为相似。

  希望以上内容对你有所帮助,感谢阅读。

你可能感兴趣的:(C,开发语言,c++,c#,c语言)