C语言中static的用法(修饰局部变量,修饰全局变量,修饰函数)

static 关键字有三种用法

1. static 修饰局部变量 - 静态局部变量

static可使得局部变量出了自己的范围也不会销毁,本质上是改变了局部变量的生命周期,但其作用域还是局部的。
详细点说,就是有时我们希望函数中局部变量的值在函数调用结束后不销毁而继续保留原值,即希望其占用的存储单元不释放。在下一次再调用该函数时,该变量已有值(就是上一次函数调用结束时的值)。
这时就该指定该局部变量为“静态局部变量”,用关键字static 对其进行声明。
我们一起通过下面简单的例子来了解它的特点。

#include<stdio.h>
int fun(int a)
{
	int b = 0;
	static int c = 3;
	b = b + 1;
	c = c + 1;
	return (a + b + c);
}
int main()
{
	int a = 2, i;
	for (i = 0; i < 3; i++)
		printf("%d\n", fun(a));
	return 0;
}

运行结果

7
8
9

前后三次调用fun函数,b、c的值变化如下表
请添加图片描述
解析:静态局部变量(c)是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。而对自动变量(b)赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值。相当于执行一次赋值语句。

另外,我们还要知道,
如果在定义局部变量时不给它赋初值,那么对静态局部变量来说,编译时自动赋初值0(对数值型变量),或者空字符’\0’ (对字符变量)。而对自动变量来说,其值是个不确定的值。

虽然静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它。因为它是局部变量,只能被本函数引用,而不能被其他函数引用。

2. static 修饰全局变量 - 静态全局变量

全局变量本身是具有外部链接属性的,即全局变量的作用域是整个工程,但是如果用 static 修饰全局变量,就会使得全局变量失去外部链接属性,变成内部链接属性,即只能在自己的文件中使用,所以 static 修饰的全局变量时,只能在自己的 .c 文件中使用。
我们一起来看下面这个例子:
我们创建两个文件,add.c和test.c,此时项目可以运行。
请添加图片描述
输出

2000

但当我们一旦用static来修饰全局变量g_val时,就会报错。如下:
请添加图片描述

3. static 修饰函数 - 静态函数

函数默认是有外部链接属性的,但是被 static 修饰后,会使得函数失去外部链接属性,变成内部链接属性。所以 static 修饰的函数只能在自己所在的 .c 文件内部使用,不能在其他文件中使用。和 static 修饰全局变量 很像。
一起来看下面这个例子

请添加图片描述
当在函数Add前加一个static时,报错
在这里插入图片描述

以上就是我整理的C语言中static 关键字的三种用法。
如有错误,大家多多指正。
记得点赞****关注,见证我的成长!
让我们一起学习,一起进步,加油!
请添加图片描述

  • 106
    点赞
  • 184
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
C语言,`static`关键字不能直接用于结构体变量。`static`关键字主要用于修饰函数全局变量,具有不同的作用。 当`static`用于全局变量时,它会改变全局变量的作用域,将其限制在定义它的源文件,其他源文件无法访问该全局变量。这样可以避免不同源文件之间的命名冲突。 当`static`用于函数内部的局部变量时,它会改变局部变量的生命周期,使其在函数调用之间保持其值不变。这意味着,每次函数被调用时,该局部变量的值都会保持上一次调用结束时的值,而不会重新初始化。 然而,`static`不能直接用于结构体变量。如果要限制结构体变量的作用域,可以将结构体定义在某个函数内部,这样它就只能在该函数内部使用。或者,可以使用指针来分配和管理结构体变量的内存,在需要时进行动态分配和释放。 下面是一个示例代码,演示了如何在函数内部定义和使用结构体: ```c #include <stdio.h> void func() { struct MyStruct { int x; int y; }; struct MyStruct myVar; myVar.x = 10; myVar.y = 20; printf("x: %d, y: %d\n", myVar.x, myVar.y); } int main() { func(); return 0; } ``` 输出结果将是: ``` x: 10, y: 20 ``` 在上面的例子,`MyStruct`结构体被定义在`func`函数内部,只能在该函数内部使用。通过创建一个结构体变量`myVar`,并为其成员赋值,我们可以在函数内部访问和操作结构体的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值