05 變數屬性

2021-09-10 16:34:09 字數 2255 閱讀 5825

注:部落格中內容主要來自《狄泰軟體學院》,部落格僅當私人筆記使用。

測試環境:ubuntu 14.04

gcc版本:4.8.4

一、c語言的變數屬性

* c語言中的變數可以有自己的屬性

* 在定義變數的時候可以加上「屬性」關鍵字

* 「屬性」關鍵字指明變數的特有意義

語法:

property type var_name;

示例: int main()

二、auto關鍵字

* auto即c語言中區域性變數的預設屬性

* auto表明將被修飾的變數儲存於棧上

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

示例:

void f()

三、register關鍵字

* register關鍵字指明將區域性變數儲存於暫存器中

* register只是請求暫存器變數,但不一定請求成功

* register變數的必須是cpu暫存器可以接受的值

* 不能用&運算子獲取register變數的位址

#include register int g_v; //error,不是區域性變數

int main()

register為了最大限度提高**速率,被register修飾的變數不能用&運算子獲取位址。

四、static關鍵字

* static關鍵字指明變數的「靜態」屬性

- static修飾的區域性變數儲存在程式靜態區

* static關鍵字同時具有「作用域限定符」的意義

- static修飾的全域性變數作用域只是宣告的檔案中

- static修飾的函式作用域只是宣告的檔案中

#include int g_v;    //全域性變數,程式的任意地方均能訪問

static int g_vs; //靜態全域性變數,只有當前檔案中可訪問

int main()

例項分析

auto,register,static對比分析

5-1.c

#include int f1()

int f2()

int main()

for(i=0; i<5; i++)

return 0;

}

操作:

5-1.c:27:2: error: address of register variable 『j』 requested

printf("%p\n", &j);

b.注釋掉main()函式中:

//printf("%p\n", &j);   // error
編譯通過,列印:

0x0027f934

0x0031815811

1111

2345

分析:

區域性變數出棧後會被銷毀,靜態變數宣告週期是整個程式執行週期。

五、extern關鍵字

* extern用於宣告「外部」定義的變數和函式

- extern變數在檔案的其它地方分配空間

- extern函式在檔案的其它地方定義

* extern用於「告訴」編譯器用c方式編譯

c++編譯器和一些變種c編譯器缺省會按「自己」的方式編譯函式和變數,通過extern關鍵字

可以命令編譯器「以標準c方式進行編譯」。

extern "c"

}

程式設計實驗

static和extern的使用

5-2.c

#include extern int geti();

int main()

g.cstatic int g_i;

int geti()

操作:

a. gcc 5-2.c g.c -o 5-2.out編譯正確,列印結果:

0
小結:

* auto變數儲存在程式的棧中,預設屬性

* static變數儲存在程式靜態區中,使用完畢後資料不銷毀

* register變數請求儲存於cpu暫存器中

* extern變數在檔案的其它地方分配空間

* extern能夠指示編譯器按照標準c方式編譯程式

C05 變數屬性

6.總結 語法 property type var name 示例 intmain void f include register int g val error int main include int g val 全域性變數,可以在程式的任意位置訪問 static int g sval 靜態全域...

spring 05 屬性注入

spring屬性注入 autowired resource autowired 自動裝配 根據類的型別進行自動裝配,無需在類中指定set方法。但出現的問題是如果含有多個同樣的型別,如果不知道名稱則會報錯。原因很簡單 程式分不清楚你要裝入的是哪個型別。指定裝入型別的方式 1 在類的宣告除指定名字 re...

條件變數屬性 時鐘屬性

條件變數有兩個屬性 程序共享屬性 時鐘屬性。1 程序共享屬性 條件變數與互斥量的共享屬性的用法一樣 int pthread condattr init pthread condattr t attr int pthread condattr destroy pthread condattr t at...