學點 C 語言(34): 函數 – 關於變數(auto、static、register、extern、volatile、restrict)

來源:互聯網
上載者:User
1. 局部變數:
局部變數也叫自動變數, 它聲明在函數開始, 生存於棧, 它的生命隨著函數返回而結束.
#include <stdio.h>int main(void){    auto int i = 9; /* 聲明局部變數的關鍵字是 auto; 因可以省略, 幾乎沒人使用 */       printf("%d\n", i);      getchar();    return 0;}

2. 全域變數:

全域變數聲明在函數體外, 一般應在函數前; 每個函數都可以使用它, 不過全域變數應盡量少用.
#include <stdio.h>void add(void);void mul(void);int gi = 3; /* 全域變數 */int main(void){        printf("%d\n", gi);  /* 3  */    add();    printf("%d\n", gi);  /* 5  */    mul();    printf("%d\n", gi);  /* 10 */          getchar();    return 0;}void add(void) {    gi += 2;}void mul(void) {    gi *= 2;}

全域變數會被初始化為空白, 而局部變數在沒有賦值前是一個垃圾值:

#include <stdio.h>int gi; /* 全域變數 */int main(void){    int i; /* 控制代碼變數 */        printf("%d, %d\n", gi, i);          getchar();    return 0;}

當全域變數與局部變數重名時, 使用的是局部變數:

#include <stdio.h>int a = 111, b = 222;int main(void){    int a = 123;    printf("%d,%d\n", a, b); /* 123,222*/    getchar();        return 0;}

3. static 關鍵字:

用 static 關鍵字修飾的局部變數是靜態局部變數;
靜態局部變數存值如同全域變數, 區別在於它只屬於擁有它的函數; 它也會被初始化為空白.
#include <stdio.h>void fun1(void);void fun2(void);int main(void){        int i;        for (i = 0; i 

用 static 關鍵字修飾的全域變數是靜態全域變數; 靜態全域變數只能用於定義它的單元.

//譬如在 File1.c 裡面定義了:static int num = 99;  /* 去掉前面的 static 其他單元才可以使用 *///在 File2.c 裡使用:#include <stdio.h>extern int num;int main(void){        printf("%d\n", num);     getchar();    return 0;}

用靜態變數記錄函數被調用的次數:

#include <stdio.h>int fun(void);int main(void){        int i;    for (i = 0; i 

4. 寄存器變數(register):

書上說寄存器變數會盡量把變數放到寄存器(而不是棧或堆), 從而加快存取速度, 我試了一下, 效果一般般.
#include <stdio.h>#include <time.h>#define TIME 1000000000int m, n = TIME; /* 全域變數 */int main(void){       time_t start, stop;    register int a, b = TIME; /* 寄存器變數 */    int x, y = TIME;          /* 一般變數   */        time(&start);    for (a = 0; a 

4. extern 關鍵字:

使用外部全域變數應該用 extern 重新聲明一下;
如果不使用 extern, 將是重新定義;
在連結階段, 同一程式中不同單元的全域變數是共用的所以不能重新定義;
本例為了省事並沒有涉及另一個檔案, 只是把變數放在檔案尾類比了一下.

另外, extern 主要還是用於函數.

#include <stdio.h>extern int g1;int main(void){        extern int g2;    printf("%d,%d\n", g1,g2);      getchar();    return 0;}int g1 = 77;int g2 = 88;

5. volatile 關鍵字:

程式在使用變數時, 特別是連續多次使用變數時, 一般是載入寄存器, 直接從寄存器存取, 之後再還回記憶體;
但如果此變數在返回記憶體時, 假如記憶體中的值已經改變了(從外部修改了)怎麼辦?
為了避免這種情況的發生, 可以用 volatile 說明此變數, 以保證變數的每次使用都是直接從記憶體存取.
但這樣肯定會影響效率, 幸好它並不常用.

另外: 如果 const volatile 同時使用, 這表示此變數只接受外部的修改.

#include <stdio.h>volatile int num = 123;int main(void){        printf("%d\n", num);    getchar();    return 0;}

6. restrict 關鍵字:

restrict 有點和 volatile 相反; 不過 restrict 只是對指標.
好像 C++Builder 2009 並不支援它, 暫時無法測試.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.