C語言簡明講解變量的屬性
一、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 關鍵字指明變量的“靜態(tài)”屬性
- static 修飾的局部變量存儲在程序靜態(tài)區(qū)
static關鍵字同時具有“作用域限定符”的意義
- static 修飾的全局變量作用域只是聲明的文件中
- static 修飾的函數(shù)作用域只是聲明的文件中
#include<stdio.h>
int g_v; //全局變量,程序的任意地方均能訪問
static int g_vs; //靜態(tài)全局變量,只在當前文件中可訪問
int main()
{
int var; //局部變量,在棧上分配空間
static int svar; //靜態(tài)局域變量,在靜態(tài)數(shù)據(jù)區(qū)分配空間
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 的存儲區(qū)位于靜態(tài)區(qū),作用域位于 main 中
register int j = 0; // 向編譯器申請將 j 存儲于寄存器中
printf("%p\n", &i);
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;
}下面為輸出結(jié)果:

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

另外,可以看到 i 和 k 的內(nèi)存地址相隔很遠,這是由于這兩個變量一個在棧上,一個在靜態(tài)區(qū)
五、extern 關鍵字
extern 用于聲明“外部”定義的變量和函數(shù)
- extern 變量在文件的其它地方分配空間
- extern函數(shù)在文件的其它地方定義
extern 用于“告訴”編譯器用C方式編譯
C++ 編譯器和一些變種C編譯器默認會按“自己”的方式編譯函數(shù)和變量,通過 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("%d\n", getI());
return 0;
}下面為輸出結(jié)果:

注意如果想要直接在 test.c 文件里獲得 g_i 的值是不行的,因為static 修飾的全局變量作用域只是聲明的文件中
六、小結(jié)
- auto 變量存儲在程序的棧中,默認屬性
- static 變量存儲在程序靜態(tài)區(qū)中
- register 變量請求存儲于CPU寄存器中
- extern 變量在文件的其它地方分配空間
- extern 能夠指示編譯器按照標準C方式編譯程序
到此這篇關于C語言簡明講解變量的屬性的文章就介紹到這了,更多相關C語言變量的屬性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Qt 使用Poppler實現(xiàn)pdf閱讀器的示例代碼
下面小編就為大家分享一篇Qt 使用Poppler實現(xiàn)pdf閱讀器的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01
詳解VisualS tudio Code開發(fā)Arm嵌入式Linux應用
本文介紹如何在 Visual Studio Code 中使用 Yocto Project 生成的 Linux SDK,并針對 Arm 處理器進行 C/C++ 應用交叉編譯和調(diào)試,感興趣的朋友跟隨小編一起看看吧2021-04-04

