目錄
- 一.static 簡介
- 二.static 修飾變數
- 1.static 區域靜態變數
- 2.static 全域靜態變數
- 三.static 修飾函式
- 四.猜你喜歡
零基礎 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.
*/
四.猜你喜歡
- C 語言 陣列下標越界和記憶體溢位區別
- C 語言 使用指標遍歷陣列
- C 語言 指標和陣列區別
- C 語言 指標陣列和陣列指標區別
- C 語言 野指標
- C 語言 函式值傳遞和址傳遞
- C 語言 函式不定長引數
- C 語言 函式指標
- C 語言 指標函式
- C 語言 回呼函式 callback
- C 語言 #pragma once
- C 語言 #include <> 與 #include “” 區別
- C 語言 const 修飾函式引數
- C 語言 const 和 define 區別
- C 語言 #運算子
- C 語言 ##運算子
- C 語言 __VA_ARGS__
- C 語言 ##__VA_ARGS__
- C 語言 函式不定長引數 ##__VA_ARGS__經典案例
- C 語言 va_start / va_end / va_arg 自定義 printf 函式
- C 語言 main 函式
- C 語言 main 函式引數 main(int argc, char *argv[])
- C 語言 區域變數
- C 語言 全域變數
- C 語言 全域變數和區域變數區別
- C 語言 static
未經允許不得轉載:猿說編程 ? C 語言 static
本文由博客 - 猿說編程 猿說編程 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/308194.html
標籤:C
上一篇:程式人生 | UNIX 環境高級編程技巧之 getopt & getopt_long 使用示例
下一篇:第六階段_typedef關鍵字詳解:創建一個classroom的結構體用來保存一個班級 的資訊,所有學生的資訊,以及班級人數
