C語言之存儲類的相關(guān)的關(guān)鍵字-創(chuàng)新互聯(lián)

不同的數(shù)據(jù)在內(nèi)存中的存儲位置是不同的,總體來說內(nèi)存中存儲數(shù)據(jù)的地方主要有四部分:棧、堆、數(shù)據(jù)段、bss段,這些地方分別存放著不同的數(shù)據(jù),比如棧一般用來存儲局部變量,堆內(nèi)存需要程序員字自己申請以及釋放,主要用來存放比較大的數(shù)據(jù);數(shù)據(jù)段主要用來存放顯示初始化的全局變量和static關(guān)鍵字修飾的靜態(tài)局部變量;bss段一般用來存放未顯式初始化的全局變量或顯式初始化為0的全局變量(C語言中,默認全局變量初始化為0)。C語言還提供了一些關(guān)鍵字來修飾變量,使其附有其他的屬性,這些關(guān)鍵字主要有:auto、static、const、register、extern、volatile、restrict。

成都創(chuàng)新互聯(lián)不只是一家網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司;我們對營銷、技術(shù)、服務(wù)都有自己獨特見解,公司采取“創(chuàng)意+綜合+營銷”一體化的方式為您提供更專業(yè)的服務(wù)!我們經(jīng)歷的每一步也許不一定是最完美的,但每一步都有值得深思的意義。我們珍視每一份信任,關(guān)注我們的成都做網(wǎng)站、成都網(wǎng)站制作質(zhì)量和服務(wù)品質(zhì),在得到用戶滿意的同時,也能得到同行業(yè)的專業(yè)認可,能夠為行業(yè)創(chuàng)新發(fā)展助力。未來將繼續(xù)專注于技術(shù)創(chuàng)新,服務(wù)升級,滿足企業(yè)一站式成都營銷網(wǎng)站建設(shè)需求,讓再小的成都品牌網(wǎng)站建設(shè)也能產(chǎn)生價值!

1:auto

 auto關(guān)鍵字的作用只有一個:修飾局部變量,auto關(guān)鍵字修飾后的局部變量表示是自動局部變量,自動局部變量是分配在棧上面的,C語言中默認局部變量就是自動局部變量。

2:static

 static關(guān)鍵字的作用有兩種:

 第一種:修飾局部變量,得到靜態(tài)局部變量,靜態(tài)局部變量是被分配在數(shù)據(jù)段或者bss段上面的,而非靜態(tài)局部變量是被分配在棧上面的。

 第二種:修飾全局變量,得到靜態(tài)全局變量,靜態(tài)全局變量和非靜態(tài)全局變量的比較如下:

(1)靜態(tài)全局變量和全局變量的存儲類一樣,都是被分配在數(shù)據(jù)段或者bss段

(2)靜態(tài)全局變量和全局變量的生命周期一樣,

(3)靜態(tài)局部變量的作用域是代碼塊作用域({}:為一個代碼塊,普通局部變量一

樣),鏈接屬性是無連接;全局變量的作用域是文件作用域(和函數(shù)一樣),鏈接屬性是外連接。

3:const

 const常被稱為常量修飾符,也就是說const修飾后的“變量”變成了常量,(所以在函數(shù)傳參時常用const來修飾輸入型參數(shù),不用const修飾的參數(shù)我們常認為是輸出型參數(shù)。)但是在C語言中,這種常量也不算是完全不可變的,因為const修飾后的“變量”并不是被放到代碼段(代碼段是只讀的,數(shù)據(jù)被放到代碼段就無法修改),const關(guān)鍵字修飾的“變量”通過指針的方式還是可以修改的,具體實現(xiàn)是通過指針指向這個“變量”,然后解引用就可以修改const修飾后的“變量”。

4:register

 register關(guān)鍵字不常用,它的作用也是唯一的:register修飾的變量,將來在編譯的時候編譯器會盡量將它分配到寄存器中(平時一般的變量都是被分配到內(nèi)存中的),變量被分配到寄存器中其使用和被分配到內(nèi)存中是一樣的,但是其速寫的效率會高很多。但是由于寄存器的數(shù)量是有限的,所以這里只是盡量放到寄存器中,而不是一定。我們平時需要用register修飾的變量很少,所以需要慎用。

5:extern

 extern關(guān)鍵字是用來聲明全局變量的,原因是C語言中編譯的時候是以單個.c文件為單位來進行編譯的,但是一個大的工程中不可能只有一個.c文件,這個時候就需要extern將變量,函數(shù)等聲明要.c文件外部,這樣編譯的時候a.c中的函數(shù)和變量就可以被b.c所調(diào)用。

6:volatile

 volatile修飾的變量表示這個變量隨時可以被修改,因此編譯后的程序每次需要存儲或者讀取這個變量時都會直接從變量地址中去讀取數(shù)據(jù),而沒有volatile修飾的變量,則編譯器可能會優(yōu)化讀取和存儲,可能暫時使用的就是寄存器中的值,如果這個變量被其他程序修改了的話,編譯器就有可能認為這個變量仍然沒有被修改(原因是讀取的可能是寄存器里面的那個副的變量值,而程序修改的是內(nèi)存中變量的值)

int flag; 
void test(void)
{    
    do1();
    while(flag==0);
    do2();
    
}

只有當(dāng)flag不為0時,d02()函數(shù)才能被被執(zhí)行,假設(shè)現(xiàn)在我們通過按下按鍵來產(chǎn)生中斷,然后再中斷處理函數(shù)中將flag賦值為1,這樣d02()函數(shù)就能被執(zhí)行了,但是編譯器并不知道flag的值被其他程序所修改了,原因是編譯器在編譯的時候會對程序進行優(yōu)化,這樣的優(yōu)化會可能會將flag放入寄存器,下次讀取的時候就可能的是寄存器中的flag的那個值。

一般來說,volatile主要用在下面幾個地方

(1)中斷服務(wù)程序中修改的供其他程序檢測的變量

(2)多任務(wù)環(huán)境下各任務(wù)間共享的標(biāo)志應(yīng)該加volatile

(3)存儲器映射的硬件寄存器通常也要加volatile進行說明,因為每次對他們的讀寫可能不同。

簡單來說,volatile總是和優(yōu)化有關(guān),編譯器有一種技術(shù)叫做數(shù)據(jù)流分析,分析程序中的變量在哪賦值、在哪使用、在哪失效,分析結(jié)果可以用于常量合并,常量傳播優(yōu)化,進一步可以死代碼消除,但是有時候程序不需要這些優(yōu)化,這時候就可以通過volatile來禁止這些優(yōu)化。

對于volatile關(guān)鍵字的描述主要來自于下面的博客

http://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764231.html

7:restrict

restrict關(guān)鍵字只能用來修飾指針,不能用來修飾變量,具體用法可參照下文

http://blog.chinaunix.net/uid-22197900-id-359209.html

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站名稱:C語言之存儲類的相關(guān)的關(guān)鍵字-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://www.bm7419.com/article28/ihojp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、服務(wù)器托管、靜態(tài)網(wǎng)站、外貿(mào)建站、網(wǎng)站建設(shè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計公司