C語言簡明講解變量的屬性
一、C語言中的變量屬性
- C語言中的變量可以有自己的屬性
- 在定義變量的時(shí)候可以加上“屬性”關(guān)鍵字
- "屬性”關(guān)鍵字指明變量的特有意義
語法:
property type var_name;
示例:
int main()
{
auto char i;
register int j;
static long k;
extern double m;
return 0;
}二、auto 關(guān)鍵字
- auto 即C語言中局部變量的默認(rèn)屬性
- auto 表明將被修飾的變量存儲(chǔ)于棧上
- 編譯器默認(rèn)所有的局部變量都是 auto 的
示例:
void f()
{
int i; //局部變量默認(rèn)屬性為 auto
auto int j; //顯示申明 auto 屬性
}三、register 關(guān)鍵字
- register 關(guān)鍵字指明將局部變量存儲(chǔ)于寄存器中
- register 只是請(qǐng)求寄存器變量,但不一定請(qǐng)求成功
- register 變量的必須是CPU寄存器可以接受的值
- 不能用 & 運(yùn)算符獲取 register 變量的地址
#include<stdio.h>
register int g_v; //eror
int main()
{
register char var;
printf("0x%08X",&var); //error
return 0;
}四、static 關(guān)鍵字
static 關(guān)鍵字指明變量的“靜態(tài)”屬性
- static 修飾的局部變量存儲(chǔ)在程序靜態(tài)區(qū)
static關(guān)鍵字同時(shí)具有“作用域限定符”的意義
- static 修飾的全局變量作用域只是聲明的文件中
- static 修飾的函數(shù)作用域只是聲明的文件中
#include<stdio.h>
int g_v; //全局變量,程序的任意地方均能訪問
static int g_vs; //靜態(tài)全局變量,只在當(dāng)前文件中可訪問
int main()
{
int var; //局部變量,在棧上分配空間
static int svar; //靜態(tài)局域變量,在靜態(tài)數(shù)據(jù)區(qū)分配空間
return 0;
}下面看一段auto,register,static對(duì)比分析代碼:
#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 的存儲(chǔ)區(qū)位于靜態(tài)區(qū),作用域位于 main 中
register int j = 0; // 向編譯器申請(qǐng)將 j 存儲(chǔ)于寄存器中
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 的地址,就會(huì)報(bào)如下錯(cuò)誤:

另外,可以看到 i 和 k 的內(nèi)存地址相隔很遠(yuǎn),這是由于這兩個(gè)變量一個(gè)在棧上,一個(gè)在靜態(tài)區(qū)
五、extern 關(guān)鍵字
extern 用于聲明“外部”定義的變量和函數(shù)
- extern 變量在文件的其它地方分配空間
- extern函數(shù)在文件的其它地方定義
extern 用于“告訴”編譯器用C方式編譯
C++ 編譯器和一些變種C編譯器默認(rèn)會(huì)按“自己”的方式編譯函數(shù)和變量,通過 extern 關(guān)鍵可以命令編譯器“以標(biāo)準(zhǔn)C方式進(jìn)行編譯”,如:

下面看一段 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 的值是不行的,因?yàn)閟tatic 修飾的全局變量作用域只是聲明的文件中
六、小結(jié)
- auto 變量存儲(chǔ)在程序的棧中,默認(rèn)屬性
- static 變量存儲(chǔ)在程序靜態(tài)區(qū)中
- register 變量請(qǐng)求存儲(chǔ)于CPU寄存器中
- extern 變量在文件的其它地方分配空間
- extern 能夠指示編譯器按照標(biāo)準(zhǔn)C方式編譯程序
到此這篇關(guān)于C語言簡明講解變量的屬性的文章就介紹到這了,更多相關(guān)C語言變量的屬性內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt 使用Poppler實(shí)現(xiàn)pdf閱讀器的示例代碼
下面小編就為大家分享一篇Qt 使用Poppler實(shí)現(xiàn)pdf閱讀器的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01
詳解VisualS tudio Code開發(fā)Arm嵌入式Linux應(yīng)用
本文介紹如何在 Visual Studio Code 中使用 Yocto Project 生成的 Linux SDK,并針對(duì) Arm 處理器進(jìn)行 C/C++ 應(yīng)用交叉編譯和調(diào)試,感興趣的朋友跟隨小編一起看看吧2021-04-04
C#?CLR學(xué)習(xí)?C++使用namespace實(shí)例詳解
這篇文章主要為大家介紹了C#?CLR學(xué)習(xí)?C++使用namespace實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
C++實(shí)現(xiàn)動(dòng)態(tài)數(shù)組功能
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)動(dòng)態(tài)數(shù)組功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11

