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