1. 程式人生 > 實用技巧 >4 變數屬性

4 變數屬性

目錄

C語言的變數屬性

  • C語言中的變數可以有自己的屬性

  • 在定義變數的時候可以加上“屬性”關鍵字

  • “屬性”關鍵字指明變數的特有意義

  • 語法:property type var_name;

  • 示例

    int main()
    {
        auto char i;
        register int j;
        static long k;
        extern double m;
        
        return 0;
    }
    

auto 關鍵字

  • auto 即C語言中區域性變數的預設屬性

  • auto

    表明將被修飾的變數儲存在棧上

  • 編譯器預設所有的區域性變數都是 auto

  • 示例

    void f()
    {
        int i;  //區域性變數預設屬性為 auto
        auto int j;  //顯式宣告 auto 屬性
    }
    

register 關鍵字

  • register 關鍵字指明將區域性變數儲存在暫存器中,而不是記憶體中

  • register 只是請求暫存器變數,但不一定請求成功,暫存器的訪問速度比記憶體快

  • register 變數必須是CPU暫存器可以接受的值

  • 不能用 & 運算子獲取 register 變數的地址,因為取地址符 & 得到的地址是記憶體中的地址

  • 示例

    #include <stdio.h>
    
    register int g_v;  //error
    
    int main()
    {
        register char var;
        printf("0x%08X\n",&var);  //error
        
        return 0;
    }
    

static 關鍵字

  • static 關鍵字指明變數的“靜態”屬性

    • static 修飾的區域性變數儲存在程式靜態區,棧 -> 靜態資料區
  • static 關鍵字同時具有“作用域限定符”的意義

    • static 修飾的全域性變數作用域只是宣告的檔案中
    • static
      修飾的函式只是宣告的檔案中
  • 示例

    #include <stdio.h>
    
    int g_v;  //全域性變數,程式的任意地方都能訪問
    static int g_vs;  //靜態全域性變數,只有當前檔案中可以訪問
    
    int main()
    {
        int var;  //區域性變數,在棧上分配空間
        static int svar;  //靜態區域性變數,在靜態資料區分配空間
    }
    
  • autoregisterstatic 對比分析

    #include <stdio.h>
    
    int f1()
    {
    	int r = 0;
    	r++;
    	return r;
    }
    
    int f2()
    {
    	static r = 0;
    	r++;
    	return r;
    }
    
    int main()
    {
    	auto int i = 0;  //顯式宣告auto屬性,i為棧變數
    	static int j = 0;  //區域性變數k的儲存區位於靜態區,作用域位於main中
    	register int k = 0;  //向編譯器申請將j儲存於暫存器中
    
        //i,j的地址會相差很大
    	printf("%p\n", &i);
    	printf("%p\n", &j);
    	//printf("%p\n", &k);  //error
    
    	for (i = 0; i < 5; i++) {
    		printf("%d\n", f1());
    	}
    
    	for (i = 0; i < 5; i++) {
    		printf("%d\n", f2());
    	}
    
    	return 0;
    }
    
    //數出結果
    0117F8A4
    0002A13C
    1
    1
    1
    1
    1
    1
    2
    3
    4
    5
    

extern 關鍵字

  • extern 用於宣告“外部”定義的變數和函式

    • extern 變數在檔案的其他地方分配空間
    • extern 函式在檔案的其他地方定義
  • extern 用於“告訴”編譯器用C方式編譯

    • C++編譯器和一些變種C編譯器預設會按“自己”的方式編譯函式和變數,通過 extern 關鍵字可以命令編譯器“以標準C方式進行編譯”

    • 示例

      extern "C"
      {
          int f(int a,int b){
              return a + b;
          }
      }
      
  • staticextern 的使用

    //main.c
    #include <stdio.h>
    
    extern int getI();
    
    int main()
    {
    	printf("%d\n", getI());
    
    	return 0;
    }
    
    //g.c
    static int g_i = 1;  //只能在當前檔案中訪問
    
    int getI() {
    	return g_i;
    }