C語言關(guān)鍵字 extern const static
發表時間:2020-10-19
發布人:葵宇科技
浏覽次數:280
引言
C語言共有32個(gè)關(guān)鍵字,其中(zhōng)extern const 和(hé) static都是有關(guān)存儲與生命周期的類型。【1】
複習
一個(gè)由C/C++編譯的程序占用的内存分為以下(xià)幾個(gè)部分
1、棧區(stack):
由編譯器(qì)自動(dòng)分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中(zhōng)的棧。
2、堆區(heap):
一般由程序員分配釋放,如(rú)c中(zhōng)malloc函數,C++中(zhōng)new運算符,若程序員不釋放,程序結束時可(kě)能由系統回收 。
3、全局區(靜态區)(static):
全局變量和(hé)靜态變量的存儲是放在一塊的,初始化的全局變量和(hé)靜态變量在一塊區域, 未初始化的全局變量和(hé)未初始化的靜态變量在相鄰的另一塊區域。程序結束後由系統釋放。
4、文(wén)字常量區:
常量字符串就是放在這裡的。 程序結束後由系統釋放
5、程序代碼區:
存放函數體的二進制代碼。
static關(guān)鍵字
static在c裡面可(kě)以用來修飾變量,也可(kě)以用來修飾函數。
先看用來修飾變量的時候。在c裡面變量可(kě)分為全局數據區、棧和(hé)堆裡
一:static變量的常見應用
1:靜态局部變量和(hé)普通(tōng)局部變量的區别:
它們的主要區别是作用域不同,靜态局部變量的是包含它當前的源文(wén)件,該工程的其他源文(wén)件是不可(kě)以訪問(wèn)它的。這樣做的好處是多人聯合開發時,不必擔心變量名沖突問(wèn)題。而普通(tōng)局部變量的的作用域是當前的整個(gè)工程,整個(gè)工程裡的不同文(wén)件可(kě)以共享全局變量。
兩者都存放在全局數據區,如(rú)果沒有初始化,系統将其自動(dòng)初始化為0。
2:靜态局部變量和(hé)普通(tōng)局部變量的區别:
(1):存儲位置不同:
靜态局部變量被static修飾,其生命周期是全局的,在整個(gè)源文(wén)件執行完畢後釋放,而不會在某個(gè)當前函數執行完就釋放,所以說靜态局部變量存儲在全局數據區。由于整個(gè)生命周期是全局的,所以對其初始化隻會執行一次,後面遇到的合法初始化也會自動(dòng)跳過。但是其作用域還是局部的,在其作用域外不可(kě)以被調用。
普通(tōng)局部變量存放在堆棧中(zhōng),随函數執行完畢後自動(dòng)釋放。
(2):默認初始值不同,靜态局部變量默認初始值為0,但其如(rú)果人為初始化隻執行一次,後面的初始化都不會再執行。而普通(tōng)局部變量初始值随機,但是每一次合法初始化都會執行。
典型應用:
#include <stdio.h>
static int a;//靜态變量,隻初始化一次,默認為0
static void fun();//靜态函數,隻初始化一次
int main()
{
fun();
printf("main:a=%d\n",a);
fun();
return 0;
}
static void fun()
{
static int a=10;
int b=20;
a*=10;
b*=20;
printf("fun:a=%d,b=%d\n",a,b);
}
運行結果:
靜态函數隻初始化一次,而普通(tōng)函數可(kě)以多次初始化。且普通(tōng)全局變量默認為0。
const關(guān)鍵字
如(rú)果一個(gè)變量被const修飾,那麼它的值就不能再被改變。注意:用const修飾變量時,一定要給變量初始化,否則之後就不能再進行賦值。
1.修飾普通(tōng)變量
加const修飾是為了防止變量被修改
如(rú)果該變量為全局變量,則不能通(tōng)過指針修改,但如(rú)果是局部變量,則還是可(kě)以通(tōng)過指針修改的。
原因是:全局變量在全局靜态區,内容不能被修改,但局部變量本身仍在棧區,可(kě)以使用指針修改。
2.修飾指針變量
1)當const修飾*号時,表示不能通(tōng)過指針p_a修改p_a指向的内容。這句話有3層意思(對應上述代碼三種情況):
①當p_a指向a時,不能通(tōng)過指針p_a取*号修改a中(zhōng)的内容
②a中(zhōng)的内容仍可(kě)以由a自身修改
③p_a指向可(kě)以改變,即p_a可(kě)以指向b
可(kě)以這麼記憶:号是指針用來對指向的内存操作(讀寫)的,當對加了const修飾,意味着号的操作隻剩下(xià)隻讀的功能,也就是隻能使用号來讀取指針指向的内容,而失去了寫的特性,這點與普通(tōng)變量的情況類似。
2)當const修飾變量p_a時,表示不能改變p_a的内容,即改不了指針的指向。這句話有3層意思(對應上述代碼三種情況):
①當p_a指向a時,能通(tōng)過指針p_a取*号修改a中(zhōng)的内容
②a中(zhōng)的内容仍可(kě)以由a自身修改
③p_a指向不可(kě)以改變,即p_a不可(kě)以修改,指向b或者其他變量
3.修飾函數
to be continued
C++中(zhōng)對static和(hé)const的擴展和(hé)