首頁 > 軟體

C語言簡明講解變數的屬性

2022-04-20 13:02:21

一、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;    //eror
 
int main()
{
    register char var;
    
    printf("0x%08X",&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;    //靜態局域變數,在靜態資料區分配空間
    
    return 0;
}

下面看一段auto,register,static對比分析程式碼:

#include <stdio.h>
 
int f1()
{
    int r = 0;
    
    r++;
    
    return r;
}
 
int f2()
{
    static int r = 0;
    
    r++;
    
    return r;
}
 
 
int main()
{
    auto int i = 0;       // 顯示宣告 auto 屬性,i 為棧變數
    static int k = 0;     // 區域性變數 k 的儲存區位於靜態區,作用域位於 main 中
    register int j = 0;   // 向編譯器申請將 j 儲存於暫存器中
 
    printf("%pn", &i);
    printf("%pn", &k);
    //printf("%pn", &j);   // error
    
    for(i=0; i<5; i++)
    {
        printf("%dn", f1());
    }
    
    for(i=0; i<5; i++)
    {
        printf("%dn", f2());
    }
    
    return 0;
}

下面為輸出結果:

如果試圖獲取 register 變數 j 的地址,就會報如下錯誤:

另外,可以看到 i 和 k 的記憶體地址相隔很遠,這是由於這兩個變數一個在棧上,一個在靜態區

五、extern 關鍵字

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

  • extern 變數在檔案的其它地方分配空間
  • extern函數在檔案的其它地方定義

extern 用於“告訴”編譯器用C方式編譯

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

下面看一段 static 和 extern 的使用程式碼:

g.c

static int g_i;
 
int getI()
{
    return g_i;
}

test.c

#include <stdio.h>
 
extern int getI();
 
int main()
{
    printf("%dn", getI());
       
    return 0;
}

下面為輸出結果:

注意如果想要直接在 test.c 檔案裡獲得 g_i 的值是不行的,因為static 修飾的全域性變數作用域只是宣告的檔案中

六、小結

  • auto 變數儲存在程式的棧中,預設屬性
  • static 變數儲存在程式靜態區中
  • register 變數請求儲存於CPU暫存器中
  • extern 變數在檔案的其它地方分配空間
  • extern 能夠指示編譯器按照標準C方式編譯程式

到此這篇關於C語言簡明講解變數的屬性的文章就介紹到這了,更多相關C語言變數的屬性內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


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