1. 程式人生 > >關於static與register關鍵字

關於static與register關鍵字

本文章的大部分內容出自《C語言深度剖析》一書,再此只是記錄對他書中例子的分析並加上一些個人的理解。

對於static關鍵字,書中對其做了重點講解,其實在我們學習C++或者Java的時候,也會對其有比較長篇幅的論述。在C語言中,它就是用來修飾變數和函式。而變數又會分為全域性變數和區域性變數。

如下面的示例程式所示,其中j就是靜態全域性變數,i就是靜態全域性變數。它們都會存在記憶體的靜態區。對於靜態全域性變數來說,作用域僅限於變數被定義的檔案中,其他檔案即使使用extern宣告也沒法使用它。準確的說是從定義之處開始,到這個檔案結束,也就是說在它定義之前的那些程式碼也是無法使用它的。如果想要使用,就得在定義它的時候加上extern。

對於靜態區域性變數,在函式體中定義,就只能在這個函式裡面使用了,同一個文件中的其他函式是永不了的。由於被static修飾的變數總是存在記憶體中的靜態區,所以即使這個函式執行結束,這個靜態變數的值還是不會被銷燬,函式下次使用時仍然能用到這個值。所以在下面的測試用例中,i的值在不斷的增加。

#include<stdio.h>

static int j;

int  func1(void){
	static int i = 0;
	i++;
	return i;
}

int  func2(void){
	j = 0;
	j++;
	return j;
}

int main(void){
	int k,m,n;
	for(k = 0 ;k < 10; k++){
		m = func1();
		printf("round%d:i = %d;",k,m);
		n = func2();
		printf("round%d:j = %d\n",k,n);
	}
	return ;
}

而static在修飾函式的時候,這個函式就成了靜態函式,這個函式只能在這個檔案中使用,所以也叫內部函式。使用內部函式的好處就是不同的人編寫不同的函式時,不用但是自己定義的函式,是否會與其他檔案中的函式同名。

Register這個關鍵字我們比較少碰到,從字面就知道它就是定義一個暫存器變數,暫存器的特點就是快了。所以我們在定義一個經常用到的變數時,我們可以考慮將其定義成register變數。但是定義的暫存器變數並不一定會存在CPU的暫存器中,因為暫存器就那麼幾個,如果這類變數多了,肯定是存不下的。

既然這個register變數這麼快,好的東西用起來肯定限制就會多一些。在定義register變數時,它必須是cpu所接受的型別。這就意味著register變數必須是一個單個的值,並且其長度應小於或等於整形的長度。而且register變數可能不存在在記憶體中,所以不能用取址運算子“&”來獲取register變數的地址。