static关键字在C语言中的作用

static是C语言中的一个重要关键字,译为“静态的”,它可以用来修饰局部变量、全局变量和函数。

在了解static的功能之前,先要知道内存简单的构造。

一、内存划分的三个区域:

可以简单的把内存划分成三个区域,分别是栈区、堆区和静态区。

栈区一般放局部变量和形式参数。

堆区一般放与动态内存分配有关的函数,比如malloc函数、calloc函数、realloc函数、free函数等。

静态区一般放全局变量和静态变量。

一个普通的局部变量是放在栈区的。由于栈区的变量是进栈创建,出栈销毁的,所以一个普通的局部变量出了它的作用域就会被销毁。

而静态变量和全局变量是放在静态区的,直到程序运行结束后才被销毁。

二、static修饰局部变量:

当static修饰局部变量时,使得局部变量出了作用域不会销毁,改变了局部变量的生命周期(生命周期延长),但是作用域不变。

#include<stdio.h>
void test1()
{
    int a = 1;
    a++;
    printf("%d ", a);
}

void test2()
{
    static int a = 1;//将变量a用static修饰
    a++;
    printf("%d ", a);
}
int main()
{
    int i = 0;
    while (i < 10)
    {
        //调用函数
        test1();//打印结果为:2 2 2 2 2 2 2 2 2 2
        //因为变量a出test函数之后就被销毁了,所以再次进入函数a还是1
        i++;
    }

    printf("\n");
    i = 0;
    while (i < 10)
    
    {
        test2();//打印结果为:2 3 4 5 6 7 8 9 10 11
        //用static修饰的局部变量在函数调用之后不会被销毁
        i++;
    }
}

三、static修饰全局变量:

static修饰全局变量时会将全局变量的外部链接属性变成内部链接属性,导致全局变量只能在自己的.c文件中使用,其他的.c文件中不能使用。

用static修饰的全局变量,作用域缩短,生命周期不受影响。

#include<stdio.h>

//用extern声明外部符号
//该全局变量被定义在add.c文件中
extern int g_val1;
//一个全局变量在整个工程中都可以使用

//引入被static修饰的全局变量
extern int g_val2;

int main()
{
    printf("%d\n", g_val1);//打印结果为2023

    //printf("%d\n", g_val2);//运行时会报错,无法解析的外部符号g_val2
    //这是因为用static修饰的全局变量,使外部链接属性变成内部链接属性
    //全局变量是有外部链接属性的,在其他源文件内部只要适当是声明就可以使用
    return 0;
}

Add.c文件:

//定义全局变量
int g_val1 = 2023;

//用static修饰
static int g_val2 = 2023;

四、static修饰函数:

static修饰函数时,会将函数的外部链接属性改成内部链接属性,导致函数只能在自己的.c文件中使用,其他.c文件中不能使用。

用static修饰的函数,作用域缩短,生命周期不受影响。

#include<stdio.h>
//定义函数
int Add(int x, int y)
{
    return x + y;
}
int main()
{
    int a = 10;
    int b = 20;
    int sum = Add(a, b);
    printf("%d\n", sum);//打印结果为30

    //将Add1函数放在Add.c文件中,也是可以编译的,但是会有警告Add1未定义
    //声明外部符号
    extern int Add1(int x, int y);
    int sum1 = Add1(a, b);
    printf("%d\n", sum1);//打印结果为30

    //用static修饰函数Add2
    extern int Add2(int x, int y);
    int sum2 = Add2(a, b);
    //会报错,因为用static修饰函数后,该函数只能在自己的.c文件中使用
    //printf("%d\n", sum2);
    return 0;
}

Add.c文件:

//定义函数
int Add1(int x, int y)
{
    return x + y;
}

static int Add2(int x, int y)
{
    return x + y;
}

总结一下,static可以修饰局部变量、全局变量和函数。

修饰局部变量改变的是变量的存储类型,可以使得局部变量的生命周期延长,作用域不变。

修饰全局变量改变的是变量的链接属性,可以使变量只能在自己的.c文件中使用。

修饰函数改变的是函数的链接属性,可以是函数只能在自己的.c文件中使用。

以上就是我这次分享的内容啦!写的不好,请多担待!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值