C語言 static - C語言零基礎入門教程


目錄

零基礎 C/C++ 學習路線推薦 : C/C++ 學習目錄 >> C 語言基礎入門

一.static 簡介

C 語言中,static 關鍵字不僅可以用來修飾變量,還可以用來修飾函數。在使用 static 關鍵字修飾變量時,我們稱此變量為靜態變量。

1.如果局部變量使用 static 修飾,那么該變量就是局部靜態變量;

#include <stdio.h>

int main()
{
   static int x = 0; //局部靜態變量
   printf("www.codersrc.com");
   return 0;
}

2.如果全局變量使用 static 修飾,那么該變量就是全局靜態變量;

#include <stdio.h>

static int x = 0; //全局靜態變量

int main()
{
   printf("www.codersrc.com");
   return 0;
}

3.如果函數使用 static 修飾,那么該函數就是靜態函數;

/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 static
//@Time:2021/07/18 07:30
//@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累!
/******************************************************************************************/


#include <stdio.h>


static int func() //靜態函數
{
    printf("靜態函數");
    return 0;
}

int main()
{
   func();
   printf("www.codersrc.com");
   return 0;
}
/*
輸出:靜態函數www.codersrc.com
*/

二.static 修飾變量

1.static 局部靜態變量

定義在函數內部的變量稱為局部變量(Local Variable),它的作用域僅限於函數內部, 離開該函數后就是無效的,生命周期直接結束,再使用就會報錯。

而使用 static 修飾的局部靜態變量,它的作用域僅限於函數內部, 離開該函數后就是無效的,**生命周期**直到程序結束,舉個栗子:

/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 static
//@Time:2021/07/18 07:30
//@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累!
/******************************************************************************************/


#include <stdio.h>


int func1()
{
    int x = 5;
    x++;
    printf("函數func1 局部變量 x = %d\n",x);
    return 0;
}

int func2()
{
    static int x = 10;
    x++;
    printf("函數func2 靜態局部變量 x = %d\n",x);
    return 0;
}

int main()
{

    for(int i = 0;i<10;i++)
    {
       func1();
       func2();
    }
    return 0;
}
/*
輸出:

函數func1 局部變量 x = 6
函數func2 靜態局部變量 x = 11
函數func1 局部變量 x = 6
函數func2 靜態局部變量 x = 12
函數func1 局部變量 x = 6
函數func2 靜態局部變量 x = 13
函數func1 局部變量 x = 6
函數func2 靜態局部變量 x = 14
函數func1 局部變量 x = 6
函數func2 靜態局部變量 x = 15
函數func1 局部變量 x = 6
函數func2 靜態局部變量 x = 16
函數func1 局部變量 x = 6
函數func2 靜態局部變量 x = 17
函數func1 局部變量 x = 6
函數func2 靜態局部變量 x = 18
函數func1 局部變量 x = 6
函數func2 靜態局部變量 x = 19
函數func1 局部變量 x = 6
函數func2 靜態局部變量 x = 20
*/

在函數 func 1 和 func 2 中都有變量 x , 根據輸出的結果可以看出來,不管是普通局部變量還是 static 修飾的靜態局部變量,作用域僅僅只在函數內部有效;

由此可見,靜態局部變量的效果跟全局變量有一拼,但是作用域僅僅限於函數體內部;

2.static 全局靜態變量

  • 1.static 全局變量只初使化一次;

  • 2.在單個 .h 或者 .c 文件中,普通全局變量和 static 修飾的 全局靜態變量是一樣的;

  • 3.當一個程序由多個 .h 或者 .c 文件組成時,全局變量在各個源文件中都是有效的 ,而 static 修飾的 全局靜態變量僅僅只能在當前的 .h 或者 .c 文件使用,其他文件聲明或者定義相同名字的全局變量也不會產生沖突,從而達到降低程序耦合性的目的;

  • 4.static 修飾的變量都存放在靜態數據區,內存中所有的字節默認值都是 0x00(全局變量也一樣),因此全局變量和 static 修飾的變量默認值為 0。

    /**********/
    //@Author:猿說編程
    //@Blog(個人博客地址): www.codersrc.com
    //@File:C 語言教程 - C 語言 static
    //@Time:2021/07/18 07:30
    //@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累!
    /**********/

    include <stdio.h>

    static int x; //靜態全局變量
    int y; //全局變量
    int main(void)
    {
    static int z; //靜態局部變量
    printf(" x:%d\n y:%d\n z:%d",x,y,z);
    return 0;
    }

    /*

    輸出:
    x:0
    y:0
    z:0
    */

三.static 修飾函數

  • 靜態函數只能在聲明它的文件中可見,其他文件不能引用該函數
  • 不同的文件可以使用相同名字的靜態函數,互不影響

下面兩個文件的例子說明使用 static 聲明的函數不能被另一個文件引用:

/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 static
//@Time:2021/07/18 07:30
//@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累!
/******************************************************************************************/


/* 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");
}
/*
輸出:
error:file1.c:(.text+0x20):對‘fun1’未定義的引用
collect2: error: ld returned 1 exit status
*/

修改文件,不使用 static 修飾符,可在另一文件中引用該函數:

/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 static
//@Time:2021/07/18 07:30
//@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累!
/******************************************************************************************/


/* 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>

void fun1(void)
{
    printf("hello from static fun1.\n");
}

/*
輸出:
hello from fun.
hello from static fun1.
*/

四.猜你喜歡

  1. C 語言 數組下標越界和內存溢出區別
  2. C 語言 使用指針遍歷數組
  3. C 語言 指針和數組區別
  4. C 語言 指針數組和數組指針區別
  5. C 語言 野指針
  6. C 語言 函數值傳遞和址傳遞
  7. C 語言 函數不定長參數
  8. C 語言 函數指針
  9. C 語言 指針函數
  10. C 語言 回調函數 callback
  11. C 語言 #pragma once
  12. C 語言 #include <> 與 #include “” 區別
  13. C 語言 const 修飾函數參數
  14. C 語言 const 和 define 區別
  15. C 語言 #運算符
  16. C 語言 ##運算符
  17. C 語言 __VA_ARGS__
  18. C 語言 ##__VA_ARGS__
  19. C 語言 函數不定長參數 ##__VA_ARGS__經典案例
  20. C 語言 va_start / va_end / va_arg 自定義 printf 函數
  21. C 語言 main 函數
  22. C 語言 main 函數參數 main(int argc, char *argv[])
  23. C 語言 局部變量
  24. C 語言 全局變量
  25. C 語言 全局變量和局部變量區別
  26. C 語言 static

未經允許不得轉載:猿說編程 » C 語言 static

本文由博客 - 猿說編程 猿說編程 發布!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM