首頁 > 軟體

C語言中static的使用方法範例詳解

2022-07-29 14:03:44

前言

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("%dn", g_val);
	return 0;
}

輸出結果:

static可以修飾全域性變數,加上static看一下有什麼不同:

static int g_val = 2022;//全域性變數

主檔案不變:

#include <stdio.h>
extern g_val;//extern 用來宣告外部命令
int main()
{
	printf("%dn", 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("%dn", c);
	return 0;
}

輸出結果:

其實一個函數本身具有外部連結屬性 被static修飾後外部連結屬性變成了內部連結屬性 ,只能在原始檔a.c 內部使用了,其他原始檔無法使用,使用上感覺作用域變小,我們可以發現 static 修飾全域性變數和修飾函數用法一樣 。

總結 在修飾變數的時, static修飾的靜態區域性變數只執行一次,而且延長了區域性變數的生命週期,直到程式執行結束以後才釋放。static修飾全域性變數的時,這個全域性變數只能在本檔案中存取,不能在其它檔案中存取,即便是extern外部宣告也不可以。static修飾一個函數,則這個函數的只能在本檔案中呼叫,不能被其他檔案呼叫。Static修飾的區域性變數存放在全域性資料區的靜態變數區。

補充:static的好處是什麼?

1、隱藏變數或函數、隔離錯誤,有利於模組化程式

在程式設計中,難免會用到全域性變數,全域性變數的作用域是整個源程式,當一個源程式由多個原始檔組成時,全域性變數在所有的原始檔中都是有效的。如果希望全域性變數僅限於在本原始檔中使用,在其他原始檔中不能參照,也就是說限制其作用域只在定義該變數的原始檔內有效,而在同一源程式的其他原始檔中不能使用,這時,就可以通過在全域性變數上加static來實現,使全域性變數被定義成一個靜態全域性變數。這樣就可以避免其他原始檔使用該變數、避免其他原始檔因為該變數引起的錯誤。起到了對其他原始檔隱藏該變數和隔離錯誤的作用,有利於模組化程式。

2、保持變數內容的永續性

 有時候,我們希望函數中區域性變數的值在函數呼叫結束之後不會消失,仍然保留函數呼叫結束的值。即它所在的儲存單元不釋放。這時,應該將該區域性變數用關關鍵字static宣告為靜態區域性變數。當區域性變數被宣告為靜態區域性變數的時候,也就改變了區域性變數的儲存位置,從原來的棧中存放改為靜態儲存區存放,全域性變數也存放在靜態儲存區,靜態區域性變數與全域性變數的主要區別就在於可見性,靜態區域性變數只在其被宣告的程式碼塊中是可見的。

總結

到此這篇關於C語言中static使用的文章就介紹到這了,更多相關C語言static用法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com