C語言關鍵字 extern const static - 新聞資訊 - 雲南小程序開發|雲南軟件開發|雲南網站建設-昆明融晨信息技術有限公司

159-8711-8523

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

知識

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

您當前位置>首頁 » 新聞資訊 » 技術分享 >

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);
}

運行結果:
在(zài)這(zhè)裏插入圖片描述

靜态函數隻初始化一次,而(é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ò)

相關案例查看更多