精华内容
下载资源
问答
  • c语言static的用法
    2018-10-31 17:18:05

     STATIC 用法有三种 

    1.对于局部变量的修饰

    如 static int a = 10;

    加static修饰后,变量存放于全局数据区  .data 意思就是和全局变量一样,值在函数函数结束后值是保留的。

    例子 

    void func()
    {
        int test_static = 10;
        n++;
        printf("the test_static value is %d/n",test_static);
    }
    /*
    对于函数的两次调用
    func();
    func();
    输出依次是11,12
    由此可以看出静态修饰的局部变量的值会保留。
    */

    2.对于全局变量的修饰

    当一个全局变量被static修饰后,此全局变量不能再其他的文件中引用,并且在其他文件中可以定义相同的全局变量名。

    3.对于函数的修饰

    当一个 函数被static修饰后,此函数不能再被其他的文件引用,并且在其他文件中可以定义相同的函数名。

     

    更多相关内容
  • C语言static用法详解

    万次阅读 多人点赞 2022-04-19 19:06:08
    使用static关键字修饰变量时,我们称此变量为静态变量。静态变量的存储方式与全局变量一样,都是静态存储方式。静态变量属于静态存储方式,属于静态存储方式的变量却不一定就是静态变量。 提示:以下是本篇文章...

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


    前言

    static关键字不仅可以用来修饰变量,还可以用来修饰函数。在使用static关键字修饰变量时,我们称此变量为静态变量。静态变量的存储方式与全局变量一样,都是静态存储方式。静态变量属于静态存储方式,属于静态存储方式的变量却不一定就是静态变量。


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、static修饰变量

    1.修饰局部变量

    先看段代码:

    #include <stdio.h>
    void test()
    {
    	int m = 0;
    	m = m + 1;
    	printf("%d", m);
    }
    
    int main()
    {
    	int n = 0;
    	while (n < 10)
    	{
    		test();
    		n++;
    	}
    }
    

    输出结果:
    在这里插入图片描述
    这个结果没问题,下面咱们加个static对比一下:

    
    #include <stdio.h>
    void test()
    {
    	static int m = 0;
    	m = m + 1;
    	printf("%d", m);
    }
    
    int main()
    {
    	int n = 0;
    	while (n < 10)
    	{
    		test();
    		n++;
    	}
    	return 0;
    }
    

    输出结果:
    在这里插入图片描述
    static 修饰局部变量的时候,其实改变的是局部变量的存储位置,静态的局部变量是放在静态区,放在静态区的变量出了作用域是不会销毁的,相当于生命周期延长了。
    注:变量的作用域是不变的,只是生命周期延长了。

    2.修饰全局变量

    创建一个源文件:a.c

    int g_val=2022;//全局变量
    

    引用全局变量:全局变量的作用域是整个工程

    #include <stdio.h>
    extern g_val;//extern 用来声明外部命令
    int main()
    {
    	printf("%d\n", g_val);
    	return 0;
    }
    

    输出结果:
    在这里插入图片描述
    static可以修饰全局变量,加上static看一下有什么不同:

    static int g_val = 2022;//全局变量
    

    主文件不变:

    #include <stdio.h>
    extern g_val;//extern 用来声明外部命令
    int main()
    {
    	printf("%d\n", g_val);
    	return 0;
    }
    

    输出结果:在这里插入图片描述
    此时会报错:一个全局变量具有外部链接属性的 (就是可以被其他源文件引用)但是被static 修饰后外部链接属性就变成了内部链接属性 只能在自己所在的源文件内部使用不能在其他文件内部使用.

    所以再次调试的时候就会报错

    二、static修饰函数

    源文件a.c中创建个函数名为add:
    代码如下:

    static int add(int x, int y)
    {
    	int z = x + y;
    	return z;
     }
    

    主文件test.c如下:

    extern add(int x, int y);
    int main()
    {
    	int a = 2;
    	int b = 3;
    	int c = add(a, b);
    	printf("%d\n", c);
    	return 0;
    }
    

    输出结果:
    在这里插入图片描述
    其实一个函数本身具有外部链接属性 被static修饰后外部链接属性变成了内部链接属性 ,只能在源文件a.c 内部使用了,其他源文件无法使用,使用上感觉作用域变小,我们可以发现 static 修饰全局变量和修饰函数用法一样 。


    总结

    • 在修饰变量的时, static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。
    • static修饰全局变量的时,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。
    • static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。Static修饰的局部变量存放在全局数据区的静态变量区。
    展开全文
  • C语言static关键字的作用
  • c语言static关键字用法详解

    万次阅读 多人点赞 2018-04-05 18:18:14
    static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护。 但是对于c语言初学者,static由于使用灵活,并不容易掌握。本文就staticc语言中的应用进行总结,供参考使用。错漏...

    概述

    static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护。

    但是对于c语言初学者,static由于使用灵活,并不容易掌握。本文就static在c语言中的应用进行总结,供参考使用。错漏之处,请不吝指正。

    最后一节加入了c++面向对象中static的使用特性,当作拓展阅读。


    在程序中使用static

    变量

    1. 局部变量

    普通局部变量是再熟悉不过的变量了,在任何一个函数内部定义的变量(不加static修饰符)都属于这个范畴。编译器一般不对普通局部变量进行初始化,也就是说它的值在初始时是不确定的,除非对其显式赋值。

    普通局部变量存储于进程栈空间,使用完毕会立即释放。

    静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。

    变量在全局数据区分配内存空间;编译器自动对其初始化
    其作用域为局部作用域,当定义它的函数结束时,其作用域随之结束

    小程序体会一下静态局部变量的威力:

    #include <stdio.h>
    
    void fn(void)
    {
        int n = 10;
    
        printf("n=%d\n", n);
        n++;
        printf("n++=%d\n", n);
    }
    
    void fn_static(void)
    {
        static int n = 10;
    
        printf("static n=%d\n", n);
        n++;
        printf("n++=%d\n", n);
    }
    
    int main(void)
    {
        fn();
        printf("--------------------\n");
        fn_static();
        printf("--------------------\n");
        fn();
        printf("--------------------\n");
        fn_static();
    
        return 0;
    }
    

    运行结果如下:

    -> % ./a.out 
    n=10
    n++=11
    --------------------
    static n=10
    n++=11
    --------------------
    n=10
    n++=11
    --------------------
    static n=11
    n++=12
    

    可见,静态局部变量的效果跟全局变量有一拼,但是位于函数体内部,就极有利于程序的模块化了。

    2. 全局变量

    全局变量定义在函数体外部,在全局数据区分配存储空间,且编译器会自动对其初始化。

    普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用。也就是说其他文件不能再定义一个与其相同名字的变量了(否则编译器会认为它们是同一个变量)。

    静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。

    在定义不需要与其他文件共享的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用。

    函数

    函数的使用方式与全局变量类似,在函数的返回类型前加上static,就是静态函数。其特性如下:

    • 静态函数只能在声明它的文件中可见,其他文件不能引用该函数
    • 不同的文件可以使用相同名字的静态函数,互不影响

    非静态函数可以在另一个文件中直接引用,甚至不必使用extern声明

    下面两个文件的例子说明使用static声明的函数不能被另一个文件引用:

    /* file1.c */
    #include <stdio.h>
    
    static void fun(void)
    {
        printf("hello from fun.\n");
    }
    
    int main(void)
    {
        fun();
        fun1();
    
        return 0;
    }
    
    /* file2.c */
    #include <stdio.h>
    
    static void fun1(void)
    {
        printf("hello from static fun1.\n");
    }
    

    使用 gcc file1.c file2.c编译时,错误报告如下:

    /tmp/cc2VMzGR.o:在函数‘main’中:
    static_fun.c:(.text+0x20):对‘fun1’未定义的引用
    collect2: error: ld returned 1 exit status
    

    修改文件,不使用static修饰符,可在另一文件中引用该函数:

    /* file1.c */
    #include <stdio.h>
    
    void fun(void)
    {
        printf("hello from fun.\n");
    }
    
    /* file2.c */
    int main(void)
    {
        fun();
    
        return 0;
    }
    

    同样使用 gcc file1.c file2.c编译,编译通过,运行结果如下:

    -> % ./a.out 
    hello from fun.
    

    面向对象

    静态数据成员

    在类内数据成员的声明前加上static关键字,该数据成员就是类内的静态数据成员。其特点如下:

    • 静态数据成员存储在全局数据区,静态数据成员在定义时分配存储空间,所以不能在类声明中定义
    • 静态数据成员是类的成员,无论定义了多少个类的对象,静态数据成员的拷贝只有一个,且对该类的所有对象可见。也就是说任一对象都可以对静态数据成员进行操作。而对于非静态数据成员,每个对象都有自己的一份拷贝。
    • 由于上面的原因,静态数据成员不属于任何对象,在没有类的实例时其作用域就可见,在没有任何对象时,就可以进行操作
    • 和普通数据成员一样,静态数据成员也遵从public, protected, private访问规则
    • 静态数据成员的初始化格式:<数据类型><类名>::<静态数据成员名>=<值>
    • 类的静态数据成员有两种访问方式:<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>

    同全局变量相比,使用静态数据成员有两个优势:

    • 静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性
    • 可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能
    静态成员函数

    与静态数据成员类似,静态成员函数属于整个类,而不是某一个对象,其特性如下:

    • 静态成员函数没有this指针,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数
    • 出现在类体外的函数定义不能指定关键字static
    • 非静态成员函数可以任意地访问静态成员函数和静态数据成员

    总结

    static是一个很有用的关键字,使用得当可以使程序锦上添花。当然,有的公司编码规范明确规定只用于本文件的函数要全部使用static关键字声明,这是一个良好的编码风格。

    无论如何,要在实际编码时注意自己的编码习惯,尽量体现出语言本身的优雅和编码者的编码素质。

    展开全文
  • c语言static用法详解

    千次阅读 2022-05-13 23:02:21
    static修饰变量与函数的效果

    前言

    static是静止的,静态的意思,那它有什么用呢,今天我们来了解了解。

    1.修饰局部变量

    修饰局部变量时,局部变量出了作用域,不销毁。变量生命周期变长,变成整个程序的生命周期。本质上,static修饰局部变量的时候,改变了变量的存储位置.

    内存区

    想要理解static改变变量的存储位置就得知道内存有哪几个区域。

    一般我们把进程地址空间分为三个区域:栈区,堆区,静态区

     局部变量原本存放于栈区,栈区数据特点是进入作用域创建,出作用域销毁

    static修饰局部变量后,局部变量就被保存到了静态区,静态区的特点是程序结束了才销毁。

    #include <stdio.h>
    void test()
    {
    	static a = 1;
    	a++;
    	printf("%d ", a);
    }
    int main()
    {
    	int i = 0;
    	for (i = 0; i < 10; i++)
    	{
    		test();
    	}
    	return 0;
    }

    2.修饰全局变量

    修饰全局变量的时候,这个全局变量的外部链接属性就变成了内部链接属性。其他源文件(.c)就不能再使用这个全局变量了。

    全局变量是有外部链接属性的,即可在其他的源文件中使用此变量。

     如果用static修饰全局变量,则不能在其他源文件中使用该变量了。

    3.修饰函数

    修饰函数和修饰全局变量的效果相同,函数也具有外部链接属性,如果用static修饰,则会变为内部链接属性。

    展开全文
  • static在c里面可以用来修饰变量,也可以用来修饰函数。先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。其实我们平时所说的堆栈是栈而不是堆,不要弄混。 代码如下:int a ;int main(){ int b ...
  • C语言static用法归纳
  • C语言中的static用法(超级详细)

    千次阅读 多人点赞 2022-04-15 08:15:42
    static static 一般用于修饰局部变量,全局变量,函数; (1)static修饰局部变量: (2).static修饰全局变量 (3).static修饰函数
  • C语言static使用

    万次阅读 多人点赞 2019-05-10 16:55:13
    C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。 (1)先来介绍它的第一条也是最重要的一条:隐藏。 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为...
  • EDA/PLD中的中的C语言中语言中static 用法总结用法总结一、c程序存储空间布局 C程序一直由下列部分组成: 1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令; ...
  • C语言static

    2021-09-16 07:46:36
    学习链接:c语言static关键字用法详解_guotianqing的博客-CSDN博客_static static在修饰静态局部变量的时候,即使没有赋值,编译器那么初始化是0,因为是储存在全局数据区,即使函数返回,他的值也不会改变。 #...
  • 下面是我对static关键字在C语言使用的一些总结,仅供参考。吾非大神,若有错漏之处,还请多多指点,大家一起交流学习。 正文 1. 变量 1.1 局部变量(函数体内) 局部变量定义在函数体内部 普通局部变量 是在任意一...
  • C语言static用法之函数内部static变量
  • C语言static用法

    2013-01-21 16:21:27
    C语言static用法
  • C语言static静态变量详解
  • C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条,分别是: 一是隐藏功能,对于static修饰的函数和全局变量而言 二是保持持久性功能,对于static修饰的局部变量而言。 三是因为存放在静态区...
  • 一、c程序存储空间布局  C程序一直由下列部分组成:  1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;  2)初始化数据段(数据段)——在程序中所有...
  • c语言static用法总结

    2020-11-12 10:03:59
    c语言static用法总结 一、c程序存储空间布局 C程序一直由下列部分组成: 1.正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令; 2.初始化数据段(数据段)...
  • 【每日一C之八】C语言static用法

    千次阅读 2014-04-01 19:07:55
    每日一C之static用法  每天拾一个C语言贝壳,厚积薄发,积跬步以致千里。  今日贝壳:C语言static的用法与static修饰变量的空间存储特征。  要点: static在C中主要有两个作用,一修饰作用域;二修饰生存期...
  • 哈喽,大家好,我是大鹏,目前是一名大二的学生,今天给大家带来的是static用法,希望大家给个关注和赞,有错误大佬还请指出,谢谢大家的喜欢! 1.static的定义 static代表静态的,被static修饰的全局变量、...
  • 详解C语言关键字-static的三种用法

    千次阅读 多人点赞 2022-04-12 16:38:23
    static修饰局部变量 static修饰全部变量 static修饰函数 作用域和生命周期的介绍 什么样的变量称为局部变量呢? 看图就知道了>>,这里的b,c都为局部变量,只有a为全局变量。 作用域 作用域(scope)是...
  • C语言中定义的局部变量包括函数参数都存储在栈区,但static修饰局部变量时,改变了变量的存储属性,被static修饰的变量是存储在静态区的。 存储在静态区的变量出了作用域不会销毁,静态变量的生命周期就是程序的生命...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 137,978
精华内容 55,191
关键字:

c语言static的用法