C語言關(guān)鍵字 extern const static - 新聞資(zī)訊 - 雲南小程序開發|雲南軟件開發|雲南網站(zhàn)建設-西山區知普網絡科技工作室

159-8711-8523

雲南網建設/小程序開發/軟件開發

知識

不管是網站(zhàn),軟件還是小程序,都要直接或間接能為您産生價值,我們在追求其視覺表現的同時,更側重于功能的便捷,營銷的便利,運營的高效,讓網站(zhàn)成為營銷工具,讓軟件能切實提升企業(yè)内部管理水平和(hé)效率。優秀的程序為後期升級提供便捷的支持!

您當前位置>首頁 » 新聞資(zī)訊 » 技術(shù)分享 >

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é)

相關(guān)案例查看更多