1. 程式人生 > >存儲類別,鏈接,內存管理

存儲類別,鏈接,內存管理

main cpp 區域 靜態存儲區 使用 ++ for got 全局變量

作用域:

  塊作用域~是一對花括號括起來的區域,可見範圍是從定義開始到快結尾,整個函數體也是一個塊,雖然函數的形式參數在函數的左花括號前,但是屬於函數體這個塊,以前具有塊作用域的必須聲明快的開頭,int x; for(x;;){} // c99之前,c99放寬限制推薦這樣寫 for(int x ; ;)對於for while do while if 語句所控制的代碼,即使這些代碼沒用括號括起來,也算是塊的一部分

  函數作用域~僅用於goto語句,如果標簽首次出現在函數體的內部,它的作用域也延伸整個函數。

  函數原型作用域~從形參定義到形參定義結束。

  文件作用域~定義在函數的外面,從定義開始到文件末尾都可以使用

鏈接:

   具有塊作用域,函數作用域,或是函數原型作用域的變量都是無鏈接變量;

  外部鏈接可以在多個翻譯單元中使用,內部鏈接只能在一個翻譯單元(一個源文件代碼和它所包含的頭文件)使用,定義文件作用域默認為外部鏈接,static int x=1; 為內部鏈接,int x 內部鏈接

存儲期:

  作用域和鏈接描述了標識符的可見性。 存儲期描述了通過這些標識符訪問的對象的生存期靜態存儲期:  

文件作用域 變量具有靜態存儲期 , 程序執行的過程都存在  

線性存儲期用於並發程序設設計,程序執行分為多個線程具有線性存儲期的對象從被聲明,到線性結束一直存在

塊作用域具有自動存儲期 當程序進入塊時,分配內存,退出時釋放剛才變量分配的內存然而塊區域變量也有靜態存儲區, 變量前面加入static 關鍵字

屬於自動存儲類別的變量具有自動存儲期 塊作用域,且無連接 默認情況下 聲明再塊或者函數頭中的任何變量都屬於 自動存儲類別 (為了有意覆蓋一個外部變量 ,或者強調不要把該變量改為其他存儲類別

) 可以顯示使用auto 關鍵詞。auto 關鍵詞和c++不同 如果編寫c和c++兼容的程序最好不要使用。

塊作用域的靜態變量:

  程序在所離開的塊之後,該變量不會被銷毀。可以用指針訪問。並且默認初始化為零,不能在函數的形參使用static

外部鏈接的靜態變量:

 int m=1// 1.cpp;

extern int m int main(){}//2.cpp 如果m定義在另一個文件中必須聲明這樣使用

還有一種情況  

#include<stdio.h>//1.cpp
extern int m;
void showm()
{
    extern int m;//可加可不加
    printf("%d    ", m);
}
int main()
{

    int m = 10;
    printf("%d", m);
    showm();
}

int m = 1;//2.cpp

內部靜鏈接的靜態變量:

#include<stdio.h>
int c = 1;
void showm()
{
    extern int c; //表明使用的是 全局變量c
    printf("%d    ",c);
}
int main()
{
    //extern int c 會顯示重復定義
        int c = 10;
    printf("%d", c);
    showm();
}    

int tern=1;//被定義 ,定義式聲明只能初始化一次。

main()

{ extern int tern //使用別處定義的 tern 引用式聲明,指示編譯器去別處查找定義。即extern int tern=1 錯誤

寄存器變量 register int quick ;通常使用在循環中,塊作用域,自動存儲期,無連接。 void macho (register int m)

C99 Standard技術分享圖片

存儲類別,鏈接,內存管理