C語言中的auto、 register、extern、static用法
auto、register 兩個是用來修飾變數的, extern、static兩個都變數函式都可以。
二、register變數
關鍵字regiter請求編譯器儘可能的將變數存在CPU的暫存器中。有以下幾點注意的地方。
1、register變數必須是能被CPU暫存器所接受的型別,這通常意味著register變數必須是一個單個的值,並且其長度應小於或等於整型的長度。
但是,有些機器的暫存器也能存放浮點數。
2、register變數可能不存放在記憶體中,所以不能用取址符運算子“ & ”。
3、只有區域性變數和形參可以作為register變數,全域性變數不行。
4、靜態變數不能定義為register。 register修飾符暗示編譯程式相應的變數將被頻繁地使用,如果可能的話,應將其儲存在CPU的暫存器中,以加快其儲存速度。例如下面的記憶體塊拷貝程式碼,
/* Procedure for the assignment of structures, */
/* if the C compiler doesn't support this feature */
#ifdef NOSTRUCTASSIGN
memcpy (d, s, l)
{
register char *d;
register char *s;
register int i;
while (i--)
*d++ = *s++;
}
#endif
三、static
1、修飾變數(區域性和全域性變數)
①靜態全域性變數:
在全域性資料區分配記憶體;未經初始化的靜態全域性變數會被程式自動初始化為0(自動變數的值是隨機的,除非它被顯式初始化);
作用域僅限於變數被定義的檔案中。
全域性變數和全域性靜態變數的區別:
1)全域性變數是不顯式用static修飾的全域性變數,但全域性變數 預設是靜態的,作用域是整個工程,在一個檔案內定義的全域性變數,在另一個檔案中,
通過extern 全域性變數名的宣告,就可以使用全域性變數。
2)全域性靜態變數是顯式用static修飾的全域性變數,作用域是所在的檔案,其他的檔案即使用extern宣告也不能使用。
② 靜態區域性變數
#include<cstdio>增加這條語句 char a = ‘A‘; // global variable void msg() { printf("Hellon"); }
你可能會問:為什麼在a.c中定義的全域性變數a和函式msg能在main.c中使用?前面說過,所有未加static字首的全域性變數和函式都具有全域性可見性,其它的原始檔也能訪問。此例中,a是全域性變數,msg是函式,並且都沒有加static字首,因此對於另外的原始檔main.c是可見的。 如果加了static,就會對其它原始檔隱藏。例如在a和msg的定義前加上static,main.c就看不到它們了。利用這一特性可以在不同的檔案中定義同名函式和同名變數,而不必擔心命名衝突。Static可以用作函式和變數的字首,對於函式來講,static的作用僅限於隱藏,而對於變數,static還有下面兩個作用。 (2)static的第二個作用是保持變數內容的持久。儲存在靜態資料區的變數會在程式剛開始執行時就完成初始化,也是唯一的一次初始化。共有兩種變數儲存在靜態儲存區:全域性變數和static變數,只不過和全域性變數比起來,static可以控制變數的可見範圍,說到底static還是用來隱藏的。 (3)static的第三個作用是預設初始化為0。其實全域性變數也具備這一屬性,因為全域性變數也儲存在靜態資料區。在靜態資料區,記憶體中所有的位元組預設值都是0x00,某些時候這一特點可以減少程式設計師的工作量。 最後對static的三條作用做一句話總結。首先static的最主要功能是隱藏,其次因為static變數存放在靜態儲存區,所以它具備永續性和預設值0。 下面是main.c的內容 除了標頭檔案,需要宣告函式:void msg();
int main(void) { extern char a; // extern variable must be declared before use printf("%c ", a); (void)msg(); return 0; }
2、靜態函式
在函式的返回型別前加上static關鍵字,函式即被定義為靜態函式。靜態函式與普通函式不同,它只能在宣告它的檔案當中可見,
不能被其它檔案使用。其它檔案中可以定義相同名字的函式,不會發生衝突。
static 函式….. 內部函式和外部函式 當一個源程式由多個原始檔組成時,C語言根據函式能否被其它原始檔中的函式呼叫,將函式分為內部函式和外部函式。 1 內部函式(又稱靜態函式) 如果在一個原始檔中定義的函式,只能被本檔案中的函式呼叫,而不能被同一程式其它檔案中的函式呼叫,這種函式稱為內部函式。 定義一個內部函式,只需在函式型別前再加一個“static”關鍵字即可,如下所示: static 函式型別 函式名(函式引數表) {……} 關鍵字“static”,譯成中文就是“靜態的”,所以內部函式又稱靜態函式。但此處“static”的含義不是指儲存方式,而是指對函式的作用域僅侷限於本檔案。 使用內部函式的好處是:不同的人編寫不同的函式時,不用擔心自己定義的函式,是否會與其它檔案中的函式同名,因為同名也沒有關係。 2 外部函式 外部函式的定義:在定義函式時,如果沒有加關鍵字“static”,或冠以關鍵字“extern”,表示此函式是外部函式: [extern] 函式型別 函式名(函式引數表) {……} 呼叫外部函式時,需要對其進行說明: [extern] 函式型別 函式名(引數型別表)[,函式名2(引數型別表2)……]; 案例]外部函式應用。 (1)檔案mainf.c
main() { extern void input(…),process(…),output(…); input(…); process(…); output(…); } (2)檔案subf1.c …… extern void input(……) /*定義外部函式*/ {……} (3)檔案subf2.c …… extern void process(……) /*定義外部 函式*/ {……} (4)檔案subf3.c …… extern void output(……) /*定義外部函式*/ {……}
相關推薦
C語言中的void和void*的定義及用法
void void最常見的用法,就是在函式中限定函式的引數和返回值的 void draw(void); 表明函式draw沒有引數也沒有返回值,void在別的的地方的應用我也沒見過; 實際上,如果把void 和int,char,double等型別放到一起理解的話,首先還是那
C語言中的auto、 register、extern、static用法
auto、register 兩個是用來修飾變數的, extern、static兩個都變數函式都可以。 一、 auto 定義的變數預設是auto型別的二、register變數 關鍵字regiter請求編譯器儘可能的將變數存在CPU的暫存器中。有以下幾點注
C語言中的const、extern及結構體、聯合體的定義
分析過程: A、 首先,看變數名"next", 並注意到它直接被括號所括住; B.1、所以先把括號裡的東西作為一個整體,得出“next 是一個指向 ...的指標"。 B、 然後考慮括號外面的東西,在星號字首和括號字尾之間做出選擇。 B.2、規則告訴我們優先順序較高的是右邊的函式括號,所以得出”next是一個函
【轉載】在C語言中,double、long、unsigned、int、char類型數據所占字節數
src 有關 指針變量 none nbsp ide iso isp cli 和機器字長及編譯器有關系: 所以,int,long int,short int的寬度都可能隨編譯器而異。但有幾條鐵定的原則(ANSI/ISO制訂的): 1 sizeof(short int)&
C語言中的I/O函數scanf、getchar、printf和putchar說明
重要 col ace 驗證 enter inpu 個數 是否 交互 scanf()、printf()、getchar()和putchar()這四個函數能夠讓用戶和程序交流,所以被稱為輸入/輸出函數,或簡稱為I/O函數。 這裏先結合緩沖輸入來講講scanf()和getchar
C語言中scanf、gets、fgets的區別
1.scanf會讀取標準輸入緩衝區中的輸入行內容直到遇到回車或空白(回車、tab、空格)以換行為例,會把換行符之前的資料全部讀入到scanf指定的變數中,回車(\n)依然儲存 在緩衝區中,等待下次讀取標準輸入緩衝區 遇到上面這種情況一般需要加入一下程式碼來清空快取區的行
C語言中getchar()、gets()和scanf()的特點以及scanf產生的多餘回車符問題
第一件事建議大家少用gets函式。 我遇到的這個問題實在是C語言新手比較容易遇到的一個問題。是關於get()和getchar()這兩個函式的。大家都知道,gets()函式作用
年齡與疾病、成績判斷及C語言中if else 的簡單應用
年齡與疾病 描述 某醫院想統計一下某項疾病的獲得與否與年齡是否有關,需要對以前的診斷記錄進行整理。 輸入 共2行,第一行為過往病人的數目n(0 < n <= 100),第二行為每個病人患病時的年齡。 輸出 每個年齡段(分四段:18以下,1
C語言中fstat、stat和lstat 區別
在寫應用程式的時候發現我們經常回去檢測一個檔案的大小,有了大小才能對映這個檔案到記憶體上,方便我們直接操作。 在介紹三者的區別之前,首先介紹的是一個非常重要的結構體型別,名字叫做struct stat
C語言中malloc、calloc、realloc動態記憶體分配的理解
void* realloc(void* ptr, unsigned newsize); void* malloc(unsigned size); void* calloc(size_t numElements, size_t sizeOfElement); 都在stdlib.h函式庫內 它們的返回值都是請求系
C語言中exit(0)、exit(1)、exit(2)有什麼不同?
exit好象在stdio.h裡面,所以要有包含標頭檔案 return是返回函式呼叫,如果返回的是main函式,則為退出程式 exit是在呼叫處強行退出程式,執行一次程式就結束 ----------------------------------------------
C語言中sizeof、strlen函數的使用
png .com ima block cto com 大小 studio pch 一、測試環境 Win10 + Visual Studio 2017 二、測試代碼 #include "pch.h" #include <iostream> #in
C語言中Extern用法
規範 這一 聲明 不一定 bsp 可用 代碼 指針 一點 extern用在變量或函數的聲明前,用來說明“此變量/函數是在別處定義的,要在此處引用”。 extern修飾變量的聲明。 舉例:若a.c中需引用b.c中的變量int v,可以在a.c中聲明exte
C語言中的static和extern
怕原作者刪除,所以轉載過來! 原文地址:http://blog.csdn.net/keyeagle/article/details/6708077/ C語言程式碼是以檔案為單位來
C語言中extern的用法
1.extern修飾變數或者函式的宣告。 舉例:若a.c中需引用b.c中的變數int v,可以在a.c中宣告extern int v,然後就可以引用變數v;需要注意的是,被引用的變數v的連結屬性必須是外連結(external)的,也就是說a.c要引用到變數v,不
C語言中register型別的變數有什麼意義
一般情況下,變數的值是儲存在記憶體中的,CPU 每次使用資料都要從記憶體中讀取。如果有一些變數使用非常頻繁,從記憶體中讀取就會消耗很多時間,例如 for 迴圈中的增量控制: int i; for(i=0; i<1000; i++){ // Some Cod
c語言中static和auto的區別
1、static變數存放在靜態儲存區,在程式整個執行期間都不釋放;而auto變數存放在動態儲存區,隨著生命週期的結束而立即釋放。 2、static變數只賦值一次,以後就不用賦值;而auto變數在函式每呼叫一次都要賦初值
轉載 C語言中register型別的變數有什麼意義
一般情況下,變數的值是儲存在記憶體中的,CPU 每次使用資料都要從記憶體中讀取。如果有一些變數使用非常頻繁,從記憶體中讀取就會消耗很多時間,例如 for 迴圈中的增量控制: int i; for(i=0; i<1000; i++){ // Some C
在C語言中,static靜態變數,extern外部變數的區別
1:什麼是static static,叫做靜態變數。一般用於全域性變數裡面,首先,我們來考慮一下為什麼要用到static,我們可以想一下,一個專案其實是由很多位工程師一起來完成的,他們之間是互相獨立完成自己所要完成的一個模組的,這就有可能出現定義相同的全域性變數或者全域性函
C語言中static與extern的用法
在C語言中,static與extern的用法 (1)修飾區域性變數 a.一般情況下,對於區域性變數是存放在棧區的,並且區域性變數的生命週期在該語句塊執行結束時便結束了。但是如果用static進行修飾的話,該變數便存放在靜態資料區,其生命週期一直持續到整個程式