【C】 5_變量屬性

C語言的變量屬性


  • C語言中的變量能夠有本身的屬性
  • 在定義變量的時候能夠加上"屬性"關鍵字
  • "屬性"關鍵字指明變量的特殊意義

語法:編程

`property type var_name;`

示例:函數

void code()
{
    auto char i;
    register int j;
    static long k;
    extern double m;
}

auto 關鍵字


  • auto 即C語言中局部變量的默認屬性
  • auto 代表被修飾的變量存儲於棧上
  • 編譯器默認全部的局部變量都是auto

示例:code

void code()
{
    int i;       // 局部變量默認屬性爲 auto
    auto int j;  // 顯示聲明 auto 屬性
}

register 關鍵字


  • register 關鍵字指明將局部變量存儲於寄存器中(爲了得到最高的訪問速度)
  • register 只是請求寄存器變量,但不必定請求成功(寄存器的數量是有限的)
  • register 變量必須是CPU寄存器能夠接收的值
  • 不能用 & 運算符獲取register變量的地址

示例:作用域

register int g_v;             // Error, 編譯器報錯

void code()
{
    register char var;
    
    printf("0x%p\n", &var);    // Error, 編譯器報錯
}

static 關鍵字


  • static 關鍵字指明變量的 "靜態" 屬性get

    • static 修飾的局部變量存儲在程序靜態區
  • static 關鍵字同時具備 "做用域限定符" 的意義編譯器

    • staitc 修飾的全局變量做用域只是聲明的文件中
    • staitc 修飾的函數做用域只是聲明的文件中

示例:it

#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 int j = 0;
    static int k = 0;
    register int y = 0;
    
    printf("%p\n", &i);
    printf("%p\n", &j);
    printf("%p\n", &k);
    // printf("%p\n", &y);  // Error, 編譯器報錯
    
    printf("\n");
    for(i=0; i<5; i++)
    {
        printf("%d\n", f1());
    }
    
    printf("\n");
    for(i=0; i<5; i++)
    {
        printf("%d\n", f2());
    }

    return 0;
}
輸出:
0xbfcdcbdc
0xbfcdcbd8
0x804a020

1
1
1
1
1

1
2
3
4
5

分析:
auto int i = 0; auto int j = 0; static int k = 0; 
其中 i, j, k在定義時是連續的,打印輸出 i, j 地址連續, k 地址不連續,代表 k 不是在棧中分配的空間。

extern 關鍵字


  • extern 用於聲明 "外部" 定義的變量和函數io

    • extern 變量在文件的其它地方分配空間
    • extern 函數在文件的其它地方定義
  • extern 用於 「告訴」 編譯器用 C 方式編譯編譯

    • C++ 編譯器和一些變種C編譯器默認會按 "本身" 的方式編譯函數和變量,經過 extern 關鍵字能夠命令編譯器"以標準C方式進行編譯"。

示例:變量

extern "C"
{
    int f(int a, int b)
    {
        return a + b;
    }
}

編程實驗:static 和 extern 的使用

Test_1.c
    
    #include <stdio.h>

    extern int getI();
    
    int main()
    {
        printf("%d\n", getI());
        
        return 0;
    }
    
    Test_2.c
    
    static int g_i;

    int getI()
    {
        return g_i;
    }
輸出:
0

小結

  • auto 變量存儲在程序的棧中,默認屬性
  • static 變量存儲在程序靜態區中
  • register 變量請求存儲於CPU寄存器中
  • extern 變量在文件的其它地方分配空間
  • extern 可以指示編譯器按照標準 C 方式編譯程序

以上內容參考狄泰軟件學院系列課程,請你們保護原創!

相關文章
相關標籤/搜索