最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

全面了解C語(yǔ)言?static?關(guān)鍵字

 更新時(shí)間:2022年04月14日 13:33:25   作者:野豬佩奇`  
這篇文章主要介紹了全面了解C語(yǔ)言?static?關(guān)鍵字,文章首先通過先介紹一下頭文件的創(chuàng)建展開主題的詳細(xì)內(nèi)容,需要的小伙伴可以參考一下

一,前言

大家好,歡迎來(lái)到C語(yǔ)言深度解析專欄—關(guān)鍵字詳解第二篇,在本篇中我們將會(huì)對(duì)static關(guān)鍵字進(jìn)行詳細(xì)介紹,其中要求我們掌握我上一篇中所講到的全局變量、局部變量、作用域以及生命周期的相關(guān)概念,如果對(duì)這幾個(gè)概念比較模糊的同學(xué)可以先移步我上一篇博客,下面是博客鏈接。
C語(yǔ)言關(guān)鍵字詳解

二、認(rèn)識(shí)多文件

為了理解static修飾函數(shù)的作用,我們需要了解多文件的相關(guān)內(nèi)容

1、多文件的創(chuàng)建

這里我先介紹一下頭文件的創(chuàng)建:頭文件的創(chuàng)建與.c文件的創(chuàng)建十分相似,僅僅是在選擇的時(shí)候把c++文件改成.h而已

.h:我們稱之為頭文件,一般包含函數(shù)聲明,變量聲明,宏定義,頭文件等內(nèi)容(header)
.c: 我們稱之為源文件,一般包含函數(shù)實(shí)現(xiàn),變量定義等 (.c:c語(yǔ)言)
多文件就是在一個(gè).h文件下,包含多個(gè).c文件,比如main.c test1.c test2.c teset3.c … …

2、為什么要有多文件

在一個(gè)公司的大型項(xiàng)目中,預(yù)期產(chǎn)品所要實(shí)現(xiàn)的功能往往是十分復(fù)雜的,所以一般都會(huì)將功能進(jìn)行模塊化處理,從而便于我們進(jìn)行代碼的復(fù)用、代碼的修改與維護(hù)以及多人協(xié)作,自然我們一個(gè)程序中就需要多個(gè).c文件

3、為什么要有頭文件

單純的使用源文件,組織項(xiàng)目結(jié)構(gòu)的時(shí)候,項(xiàng)目越大越復(fù)雜維護(hù)成本會(huì)變得越來(lái)越高!
所以我們?cè)诮M織項(xiàng)目結(jié)構(gòu)的時(shí)候會(huì)使用頭文件來(lái)減少大型項(xiàng)目的維護(hù)成本問題。

補(bǔ)充:頭文件中 #pragma once 的含義

大家在創(chuàng)建一個(gè).h 頭文件的時(shí)候會(huì)發(fā)現(xiàn)編譯器在頭文件的開頭會(huì)自動(dòng)加上 #pragma once

相信有許多小伙伴在曾今或者現(xiàn)在都對(duì)這東西有著深深的疑惑,其實(shí)它是用來(lái)防止頭文件被反復(fù)包含的,舉個(gè)栗子

如上所示:我在test.h中包含了頭文件<stdio.h>,但是在main.c中我又同時(shí)包含了test.h 和 stdio.h ,這就造成了stdio.h被包含了兩次,使得程序在編譯的時(shí)候?qū)tdio.h 里面的內(nèi)容拷貝了兩份,造成代碼冗余,而#pragma once 會(huì)檢查該頭文件是否已經(jīng)被包含,如若是就不在進(jìn)行拷貝。
防止頭文件反復(fù)包含的另一種方法(涉及預(yù)處理內(nèi)容,暫時(shí)不講,同學(xué)們當(dāng)作了解即可)

4、多文件在代碼中的具體體現(xiàn)

在上圖中我們?cè)趖est.c 文件中中定義了一個(gè)全局變量和一個(gè)函數(shù),然后在test.h文件中對(duì)其進(jìn)行聲明,最后在main.c文件中對(duì)全局變量和函數(shù)進(jìn)行打印和調(diào)用,我們可以發(fā)現(xiàn),這種做法是可行的,也就是說(shuō):全局變量和函數(shù)可以跨文件訪問的(這個(gè)結(jié)論在解釋下文static作用時(shí)會(huì)被用到)

三、最名不符實(shí)的關(guān)鍵字 - static

static 整體闡述

上圖是MSDN對(duì)static的解釋,翻譯過來(lái)就是:修改變量時(shí),static關(guān)鍵字指定該變量具有靜態(tài)持續(xù)時(shí)間(在程序開始時(shí)分配,在程序結(jié)束時(shí)釋放),并將其初始化為0,除非指定了其他值。在文件范圍中修改變量或函數(shù)時(shí),static關(guān)鍵字指定該變量或函數(shù)具有內(nèi)部鏈接(其名稱在聲明它的文件外部不可見)。這段話讀起來(lái)沒什么具體的概念,接下來(lái)我從static 作用的三個(gè)對(duì)象來(lái)帶大家具體了解static。

1、static 修飾局部變量

圖一:test 函數(shù)里面定義的 a 是局部變量,局部變量在棧區(qū)上開辟空間,棧區(qū)的使用特點(diǎn)是進(jìn)入變量的生命周期時(shí)自動(dòng)為其開辟空間,離開變量的生命周期時(shí)自動(dòng)銷毀對(duì)應(yīng)空間,所以這里每次調(diào)用 test 函數(shù)時(shí) a 都會(huì)被重新定義并初始化為0,所以屏幕上打印的是10個(gè)1;

圖二:我們把 a 用 static 修飾后發(fā)現(xiàn)屏幕打印的是1到10,就好像每次調(diào)用完 test 函數(shù)后 a 并沒有被銷毀,而是繼續(xù)使用,下次調(diào)用 test 函數(shù)時(shí) a 直接在之前的基礎(chǔ)上進(jìn)行 ++ 操作。
所以 static 修飾局部變量的作用是:改變局部變量的生命周期,本質(zhì)上是改變了局部變量的存儲(chǔ)位置,讓局部變量不再是在棧區(qū)上開辟空間,而是直接在靜態(tài)區(qū)上開辟空間,從而使得局部變量擁有和全局變量一樣的生命周期,即隨著整個(gè)程序生成和銷毀。

更深入的理解 static 修飾局部變量的作用:圖三,我們的程序從源文件(.c文件)變成可執(zhí)行程序(.exe文件)需要經(jīng)過編譯鏈接運(yùn)行三個(gè)環(huán)節(jié),而編譯環(huán)節(jié)又分為預(yù)處理、編譯、匯編三個(gè)階段,在匯編階段,編譯器會(huì)把我們的C語(yǔ)言代碼轉(zhuǎn)換成匯編代碼,而每一條C語(yǔ)言語(yǔ)句都對(duì)應(yīng)著多句匯編代碼,然而在圖三中,我們可以觀察到,只有 static int a = 0; 這條語(yǔ)句沒有對(duì)應(yīng)的匯編代碼,也就是說(shuō),C語(yǔ)言在編譯的時(shí)候會(huì)直接跳過這條語(yǔ)句。
本質(zhì)上是:在編譯環(huán)節(jié)的編譯階段編譯器就會(huì)為被 static 修飾的局部變量分配空間,所以C程序在運(yùn)行的過程中會(huì)直接跳過 static 修飾的語(yǔ)句,也就是說(shuō),在第二次及以上甚至第一次調(diào)用 test 函數(shù)時(shí) static int a = 0; 這條語(yǔ)句都不會(huì)被執(zhí)行。

補(bǔ)充:內(nèi)存分布:

要弄清楚這個(gè)問題,我們首先得知道內(nèi)存布局是怎樣的:

如圖,左邊是內(nèi)存的具體劃分,右邊是內(nèi)存的大概劃分,在C語(yǔ)言階段我們只需要記住右邊的圖就可以了,從圖中我們可以看到,局部變量的內(nèi)存開辟是在棧區(qū)上的,而棧區(qū)的特點(diǎn)是進(jìn)入代碼塊開辟空間,離開代碼塊釋放空間,所以局部變量的作用域和生命周期只在代碼塊內(nèi),而用static的變量則直接在靜態(tài)區(qū)開辟空間,所以變量的生命周期得到延長(zhǎng)。

2、static修飾全局變量

圖一圖二對(duì)比分析:我在Add.c中定義了一個(gè)全局變量g_val,因?yàn)槿肿兞烤哂型獠挎溄訉傩?,所以我只需要在test.c中對(duì)g_val進(jìn)行聲明之后就可以正常使用了,但是當(dāng)我用 static 來(lái)修飾g_val時(shí),我們發(fā)現(xiàn),編譯器說(shuō)g_val是無(wú)法解析的外部符號(hào);
所以 static 修飾全局變量的作用是:改變了全局變量的外部鏈接屬性(可以在其他源文件內(nèi)被訪問),使其變成內(nèi)部連接屬性(只能在本文件內(nèi)部被訪問),給我們的感覺是全局變量的作用域變小了。

3、static修飾函數(shù)

圖一圖二對(duì)比分析:這里和 static 修飾全局變量非常類似,我在Add.c中定義了一個(gè)Add函數(shù),因?yàn)楹瘮?shù)也具有外部鏈接屬性,所以我只需要在test.c中對(duì)Add函數(shù)進(jìn)行聲明之后就可以正常使用了,但是當(dāng)我用 static 來(lái)修飾Add函數(shù)時(shí),我們發(fā)現(xiàn),編譯器說(shuō)Add是無(wú)法解析的外部符號(hào);
所以 static 修飾函數(shù)的作用是:改變了函數(shù)的外部鏈接屬性(可以在其他源文件內(nèi)被訪問),使其變成內(nèi)部連接屬性(只能在本文件內(nèi)部被訪問),給我們的感覺是函數(shù)的作用域變小了。

四、總結(jié)

  • 1、 全局變量和函數(shù)是可以跨文件訪問的,因?yàn)橛幸欢ㄒ?guī)模的項(xiàng)目,一定是多文件的,多個(gè)文件之間,后續(xù)一定要進(jìn)行數(shù)據(jù)“交互”(test.h test.c main.c) ,如果不能跨文件訪問,數(shù)據(jù)"交互"成本會(huì)非常高,所以C語(yǔ)言在設(shè)計(jì)的時(shí)候就規(guī)定了全局變量和函數(shù)可以跨文件訪問
  • 2、 static 修飾局部變量的作用:改變局部變量的生命周期,本質(zhì)上是改變了局部變量的存儲(chǔ)位置,讓局部變量不再是在棧區(qū)上開辟空間,而是直接在靜態(tài)區(qū)上開辟空間,從而使得局部變量擁有和全局變量一樣的生命周期,即隨著整個(gè)程序生成和銷毀。
  • 3、static 修飾全局變量的作用:改變了全局變量的外部鏈接屬性(可以在其他源文件內(nèi)被訪問),使其變成內(nèi)部連接屬性(只能在本文件內(nèi)部被訪問)。
  • 4、static 修飾函數(shù)的作用是:改變了函數(shù)的外部鏈接屬性(可以在其他源文件內(nèi)被訪問),使其變成內(nèi)部連接屬性(只能在本文件內(nèi)部被訪問)。

到此這篇關(guān)于全面了解C語(yǔ)言 static 關(guān)鍵字的文章就介紹到這了,更多相關(guān)C語(yǔ)言 static 關(guān)鍵內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的掃雷小游戲

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • C++之Primer類型轉(zhuǎn)換方式

    C++之Primer類型轉(zhuǎn)換方式

    這篇文章主要介紹了C++之Primer類型轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • C++中四種對(duì)象生存期和作用域以及static的用法總結(jié)分析

    C++中四種對(duì)象生存期和作用域以及static的用法總結(jié)分析

    以下是對(duì)C++中四種對(duì)象生存期和作用域以及static的用法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來(lái)參考下
    2013-09-09
  • Qt在vs2019中使用及設(shè)置方法

    Qt在vs2019中使用及設(shè)置方法

    這篇文章主要介紹了Qt在vs2019中使用及設(shè)置方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • C/C++使用C語(yǔ)言實(shí)現(xiàn)多態(tài)

    C/C++使用C語(yǔ)言實(shí)現(xiàn)多態(tài)

    這篇文章主要介紹了C/C++多態(tài)的實(shí)現(xiàn)機(jī)制理解的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下,希望能給你帶來(lái)幫助
    2021-08-08
  • C語(yǔ)言 分支語(yǔ)句詳解分析

    C語(yǔ)言 分支語(yǔ)句詳解分析

    分支結(jié)構(gòu)的執(zhí)行是依據(jù)一定的條件選擇執(zhí)行路徑,而不是嚴(yán)格按照語(yǔ)句出現(xiàn)的物理順序。分支結(jié)構(gòu)的程序設(shè)計(jì)方法的關(guān)鍵在于構(gòu)造合適的分支條件和分析程序流程,根據(jù)不同的程序流程選擇適當(dāng)?shù)姆种дZ(yǔ)句
    2021-10-10
  • Qt的qDebug使用小結(jié)

    Qt的qDebug使用小結(jié)

    使用qDebug()函數(shù)它可以把調(diào)試信息直接輸出到控制臺(tái)上,本文就來(lái)介紹一下qDebug的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-06-06
  • linux環(huán)境下C++實(shí)現(xiàn)俄羅斯方塊

    linux環(huán)境下C++實(shí)現(xiàn)俄羅斯方塊

    這篇文章主要為大家詳細(xì)介紹了linux環(huán)境下C++實(shí)現(xiàn)俄羅斯方塊,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • C++11新增的包裝器詳解

    C++11新增的包裝器詳解

    由于函數(shù)調(diào)用可以使用函數(shù)名、函數(shù)指針、函數(shù)對(duì)象或有名稱的lambda表達(dá)式,可調(diào)用類型太豐富導(dǎo)致模板的效率極低。包裝器用于解決效率低的問題
    2022-08-08
  • C++基礎(chǔ)之this指針與另一種“多態(tài)”

    C++基礎(chǔ)之this指針與另一種“多態(tài)”

    this指針識(shí)別了同一個(gè)類的不同的對(duì)象,換句話說(shuō),this指針使得成員函數(shù)可以訪問同一個(gè)類的不同對(duì)象。再深入一點(diǎn),this指針使得成員函數(shù)會(huì)因?yàn)閠his指針的不同而訪問到了不同的成員變量
    2013-07-07

最新評(píng)論

新河县| 慈利县| 红河县| 普宁市| 东港市| 华安县| 阿拉善右旗| 株洲县| 陕西省| 峨边| 读书| 云林县| 延吉市| 长汀县| 沂南县| 资溪县| 米脂县| 重庆市| 泸溪县| 盐城市| 岳阳县| 务川| 漳州市| 萝北县| 正镶白旗| 彭山县| 樟树市| 全椒县| 五家渠市| 霍山县| 轮台县| 开江县| 乌拉特前旗| 奇台县| 娄烦县| 罗江县| 黑山县| 普安县| 乳源| 龙江县| 卢龙县|