iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >一文带你了解C语言中static关键字的3个作用
  • 288
分享到

一文带你了解C语言中static关键字的3个作用

摘要

目录1.修饰局部变量2.修饰全局变量3.修饰函数总结static这个关键字是“静态”的意思,在C语言里有3个作用。分别是: 1.修饰局部变量,该局部变量称为静

static这个关键字是“静态”的意思,在C语言里有3个作用。分别是:

1.修饰局部变量,该局部变量称为静态的局部变量。

2.修饰全局变量,该全局变量称为静态的全局变量。

3.修饰函数,该函数称为静态的函数。

1.修饰局部变量

一个“正常”的局部变量,不被static修饰时,是在内存中的栈区上创建的。在栈区上创建的变量的特点是:进入作用域时创建,出作用域时销毁。比如:

void func()
{
	int i = 1;
	++i;
	printf("%d ", i);
}

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

main函数和func函数里的i变量都是“正常”的局部变量,进入作用域创建,出作用域销毁。对于main函数里的i,代码执行到for循环时创建,一旦for循环结束,就会被销毁。不过,我们重点看func函数里的i,这个i也是局部变量,并且和main函数里的i不是一个变量,因为在不同的作用域里。每次调用func函数,都会创建一个i,调用结束后,这个i就被销毁了。

本质上,“正常”的局部变量的生命周期被作用域限定,进入作用域创建,出作用域销毁。所以每次调用func时,都是先创建一个i并初始化成1,i自增变成2,打印i的值(即2),func函数执行结束时把i给销毁。下次调用时还会重新创建一个i,重复上次调用的过程。如果调用10次,屏幕上就会打印10个2。

如果func里的i是被static修饰的呢?

void func()
{
	static int i = 1; // 静态的局部变量
	++i;
	printf("%d ", i);
}

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

当一个局部变量被static修饰时,该局部变量称为静态的局部变量。静态的局部变量和“正常”的局部变量不同,不是在栈区上创建的,而是在静态区上创建的。在静态区上创建的变量,生命周期是全局的,也就是说,静态局部变量的生命周期和程序的生命周期相同。

第一次调用func函数时,会在func函数内部创建一个静态的局部变量i,这个i是存储在静态区的。接着i++,打印2。当func函数执行结束时,由于i是存储在静态区的,并不会被销毁,也就是说,这个i还在。所以下次调用func函数时,并不会重新创建i,此时使用的i变量还是上次留下来的i,会保留上次的值,即2,++后打印3。再下次调用,++后打印4,以此类推。输出结果:

总结一下:static修饰局部变量,改变了变量的存储位置,本来一个局部变量是存储在栈区的,被static修饰之后就存储在静态区了。而静态区的变量的生命周期是全局的,出了作用域不会被销毁,下次进入作用域时还在。

注意:静态的局部变量虽然生命周期和“正常”的局部变量不同,但是作用域并没发生改变,仍然是在其局部范围内可以被使用。

2.修饰全局变量

一个“正常”的全局变量是具有外部链接属性的,也就是说,在一个文件内定义的全局变量,其他文件内是可以使用的,这个变量是跨文件的。当然,跨文件使用全局变量必须先声明。比如我创建2个文件,分别是test.c和main.c:

// test.c
int g_val; // 全局变量

// main.c
extern int g_val; // 跨文件使用需用extern声明
int main()
{
	g_val = 2023; // 可以跨文件使用
	return 0;
}

全局变量如果被static修饰,称为静态的全局变量。静态的全局变量具有内部链接属性,换句话说,静态的全局变量不能跨文件使用。比如:

// test.c
static int g_val; // 静态的全局变量

// main.c
extern int g_val; // 哪怕用extern声明了
int main()
{
	g_val = 2023; // 不能使用了,这么写会报错
	return 0;
}

此时的g_val是不能跨文件使用的。以上的写法会报错:找不到g_val。

总结一下:static修饰全局变量,改变了其链接属性。本来一个“正常”的全局变量是具有外部链接属性的,可以跨文件使用。但是被static修饰之后,具有内部链接属性,只能在所在的文件使用,不能跨文件使用了。相当于改变了变量的作用域。

注意:虽然静态的全局变量的作用域和“正常”的全局变量不同,但是其生命周期并没有被static改变,仍然和程序的生命周期相同。

3.修饰函数

一个“正常”的函数也是具有外部链接属性的,也能够跨文件使用。举个例子:

// test.c
int Add(int x, int y) 
{ 
	return x + y; 
}

// main.c
extern Add(int x, int y); // 声明时extern关键字、形参名x和y可以省略
int main()
{
	int sum = Add(2, 3);
	return 0;
}

一旦一个函数被static修饰,称为静态的函数。静态的函数和静态的全局变量类似,其链接属性从外部变为内部,不能跨文件使用了。比如:

// test.c
static int Add(int x, int y) 
{
	return x + y; 
}

// main.c
extern Add(int x, int y); // 哪怕声明了
int main()
{
	int sum = Add(2, 3); // 不能跨文件使用了,这么使用会报错
	return 0;
}

总结一下:本来一个“正常”的函数具有外部链接属性,可以跨文件使用,被static修饰后,其链接属性变成内部的链接属性,不能跨文件使用了,只能在自己所在的源文件内部使用。

总结

1.static修饰局部变量,称为静态的局部变量,改变了局部变量的存储位置(栈区->静态区),相当于改变了其生命周期,出了作用域不会被销毁,下次进入作用域时还在,但是其作用域仍然是其所在的局部范围。

2.static修饰全局变量,称为静态的全局变量,改变了全局变量的链接属性(外部的->内部的),相当于改变了其作用域,使得其不能跨文件使用了,但是其生命周期仍然是全局的。

3.static修饰函数,称为静态的函数,改变了函数的链接属性(外部的->内部的),使得其不能跨文件使用。

到此这篇关于一文带你了解C语言中static关键字的3个作用的文章就介绍到这了,更多相关C语言 static关键字内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 一文带你了解C语言中static关键字的3个作用

本文链接: https://www.lsjlt.com/news/208412.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c语言怎么计算字符串长度
    在C语言中,可以使用内置的strlen()函数来计算字符串的长度。该函数位于string.h头文件中。以下是一个示例代码: #inc...
    99+
    2024-05-14
    c语言
  • c语言怎么判断三个数的大小
    可以通过比较三个数之间的大小关系来判断它们的大小。以下是一个示例代码: #include <stdio.h> int ...
    99+
    2024-05-14
    c语言
  • c++排序函数sort怎么使用
    在C++中,使用sort函数对容器中的元素进行排序,可以按照默认的升序排列,也可以自定义排序规则。 下面是一个简单的例子,对一个ve...
    99+
    2024-05-14
    c++
  • c++中string的compare函数怎么使用
    在C++中,可以使用string的compare函数来比较两个string对象的大小。该函数的原型如下: int compare(c...
    99+
    2024-05-14
    c++
  • c++中string的compare函数有什么用
    c++中string的compare函数用于比较两个字符串的大小关系。该函数返回一个整数值,表示两个字符串的比较结果。 具体来说,如...
    99+
    2024-05-14
    c++
  • c++中print函数的功能有哪些
    在C++中,通常使用std::cout来进行输出操作,而不是使用print函数。std::cout是C++标准库中的一个输出流对象,...
    99+
    2024-05-14
    c++
  • c语言数据结构怎么使用
    在C语言中,数据结构可以通过定义结构体来实现。以下是一些常见的数据结构的使用方法示例: 链表: #include <std...
    99+
    2024-05-14
    c语言
  • c++中print函数的用法是什么
    在C++中没有内置的print函数,但可以使用cout来输出内容到控制台。cout是C++标准库中的一个输出流对象,可以使用<...
    99+
    2024-05-14
    c++
  • c++中concept的用法是什么
    在C++20中,Concept是一种新的语言特性,用于定义类型要求和约束。Concept可以被用来约束函数模板、类模板和普通函数的参...
    99+
    2024-05-14
    c++
  • c++中concept的作用是什么
    在C++中,concept的作用是定义一种通用的约束,用于限制模板参数的类型范围。通过使用concept,可以在编译时对模板参数进行...
    99+
    2024-05-14
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作