標籤:row 地址 stat 關鍵字 檔案 技術分享 ble border 情況
變數屬性
C語言定義變數屬性的關鍵字主要有auto、register、static、extern
1、auto關鍵字
2、register關鍵字
(1)register關鍵字指明將局部變數儲存於寄存器中;
(2)register只是請求寄存器變數,並不一定能成功;
(3)register變數必須是CPU寄存器可以接受的值;
(4)不能用&運算子擷取resister變數的地址;
(5)register不能作為全域變數,因為寄存器不能被一個變數一直佔用;
3、static關鍵字
4、extern關鍵字
5、編寫代碼
(1)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 為棧變數 auto int l = 1; // 顯示聲明 auto 屬性,l 為棧變數 static int k = 0; // 局部變數 k 的儲存區位於靜態區,範圍位於 main 中 register int j = 0; // 向編譯器申請將 j 儲存於寄存器中 printf("%p\n", &i); printf("%p\n", &l); printf("%p\n", &k); //printf("%p\n", &j); // error for(i=0; i<5; i++) { printf("%d\n", f1()); } for(i=0; i<5; i++) { printf("%d\n", f2()); } return 0;}
輸出結果為:
(2)static和extern的使用
#include <stdio.h>extern int g_i;int main(void){ printf("%d\n",g_i); return 0;}int g_i;
輸出結果為:0
若把int g_i屏蔽,則
#include <stdio.h>extern int g_i;int main(void){ printf("%d\n",g_i); return 0;}//int g_i;
輸出結果為:
同樣的道理,當其他檔案裡的變數被static修飾了,extern關鍵字失去作用;
1.c
#include <stdio.h>extern int g_i;int main(void){ printf("%d\n",g_i); return 0;}
2.c
static int g_i;
輸出結果同樣會報錯
若代碼改為一下情況,則不會報錯;
1.c
#include <stdio.h>extern int getI();int main(){ printf("%d\n", getI()); return 0;}
2.c
static int g_i;int getI(){ return g_i;}
輸出結果為:0
6、小結
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">
來自為知筆記(Wiz)
05_變數屬性