日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

【C語言】06-變量與內(nèi)存

系統(tǒng) 1876 0

一、字節(jié)和地址

為了更好地理解變量在內(nèi)存中的存儲(chǔ)細(xì)節(jié),先來認(rèn)識(shí)一下內(nèi)存中的“字節(jié)”和“地址”。

1.計(jì)算機(jī)中的內(nèi)存是以 字節(jié) 為單位的存儲(chǔ)空間。內(nèi)存的每一個(gè)字節(jié)都有一個(gè)唯一的編號(hào),這個(gè)編號(hào)就稱為 地址 。就好像酒店是以房間為單位的,每個(gè)房間都有一個(gè)唯一的房號(hào),我們根據(jù)房號(hào)就能找到對(duì)應(yīng)的房間。

【C語言】06-變量與內(nèi)存

里面的每個(gè)小框框就代表著內(nèi)存中的一個(gè)字節(jié),白色數(shù)字就是每個(gè)字節(jié)的地址(這里采取十六進(jìn)制來顯示,地址值是隨便寫的,僅作為參考,真實(shí)情況中的地址值不一定是這個(gè)),可以發(fā)現(xiàn),內(nèi)存中相鄰字節(jié)的地址是連續(xù)的。

2.大家都知道,一個(gè)字節(jié)有8位,所能表示的數(shù)據(jù)范圍是非常有限的,因此,范圍較大的數(shù)據(jù)就要占用多個(gè)字節(jié),也就是說,不同類型的數(shù)據(jù)所占用的字節(jié)數(shù)是不一樣的。

二、變量的存儲(chǔ)

1.變量類型的作用

跟其他編程語言一樣,C語言中用 變量 來存儲(chǔ)計(jì)算過程使用的值,任何變量都必須先定義類型再使用。為什么一定要先定義呢?因?yàn)樽兞康念愋蜎Q定了變量占用的存儲(chǔ)空間,所以定義變量類型,就是為了給該變量分配適當(dāng)?shù)拇鎯?chǔ)空間,以便存放數(shù)據(jù)。比如char類型,它是用來存儲(chǔ)一個(gè)字符的,一個(gè)字符的話只需要1個(gè)字節(jié)的存儲(chǔ)空間, 因此系統(tǒng)就只會(huì)給char類型變量分配1個(gè)字節(jié),沒必要分配2個(gè)字節(jié)、3個(gè)字節(jié)乃至更多的存儲(chǔ)空間。

2.變量占用多少存儲(chǔ)空間

1> 一個(gè)變量所占用的存儲(chǔ)空間,不僅跟變量類型有關(guān),而且還跟編譯器環(huán)境有關(guān)系。同一種類型的變量,在不同編譯器環(huán)境下所占用的存儲(chǔ)空間又是不一樣的。我們都知道操作系統(tǒng)是有不同位數(shù)的,比如Win7有分32位、64位,編譯器也是一樣的,也有不同位數(shù):16位、32位、64位(Mac系統(tǒng)下的clang編譯器是64bit的)。由于我們是Mac系統(tǒng)下開發(fā),就以64位編譯器為標(biāo)準(zhǔn)。

2> 下面的表格描述了在64位編譯器環(huán)境下,基本數(shù)據(jù)類型所占用的存儲(chǔ)空間,了解這些細(xì)節(jié),對(duì)以后學(xué)習(xí)指針和數(shù)組時(shí)是很有幫助的。

【C語言】06-變量與內(nèi)存

3> 下面的表格描述了在不同編譯器環(huán)境下的存儲(chǔ)空間占用情況

【C語言】06-變量與內(nèi)存

3.變量示例

當(dāng)定義一個(gè)變量時(shí),系統(tǒng)就會(huì)為這個(gè)變量分配一定的存儲(chǔ)空間。

      
        1
      
      
        int
      
      
         main()

      
      
        2
      
      
        {

      
      
        3
      
      
        char
      
       a = 
      
        '
      
      
        A
      
      
        '
      
      
        ; 

      
      
        4
      
      
        5
      
      
        int
      
       b = 
      
        10
      
      
        ;

      
      
        6
      
      
        7
      
      
        return
      
      
        0
      
      
        ;

      
      
        8
      
       }
    

1> 在64bit編譯器環(huán)境下,系統(tǒng)為變量a、b分別分配1個(gè)字節(jié)、4個(gè)字節(jié)的存儲(chǔ)單元。也就是說:

  • 變量b中的10是用4個(gè)字節(jié)來存儲(chǔ)的,4個(gè)字節(jié)共32位,因此變量b在內(nèi)存中的存儲(chǔ)形式應(yīng)該是0000 0000 0000 0000 0000 0000 0000 1010。
  • 變量a中的'A'是用1個(gè)字節(jié)來存儲(chǔ)的,1個(gè)字節(jié)共8位,變量a在內(nèi)存中的存儲(chǔ)形式是0100 0001,至于為什么'A'的二進(jìn)制是這樣呢,后面再討論。

2> 上述變量a、b在內(nèi)存中的存儲(chǔ)情況大致如下表所示:

【C語言】06-變量與內(nèi)存

(注:"存儲(chǔ)的內(nèi)容"那一列的一個(gè)小格子就代表一個(gè)字節(jié),"地址"那一列是指每個(gè)字節(jié)的地址)

  • 從圖中可以看出,變量b占用了內(nèi)存地址從ffc1~ffc4的4個(gè)字節(jié),變量a占用了內(nèi)存地址為ffc5的1個(gè)字節(jié)。每個(gè)字節(jié)都有自己的地址,其實(shí)變量也有地址。變量存儲(chǔ)單元的 第一個(gè)字節(jié)的地址就是該變量的地址 變量a的地址是ffc5,變量b的地址是ffc1。
  • 內(nèi)存尋址是從大到小的 ,也就是說做什么事都會(huì)先從內(nèi)存地址較大的字節(jié)開始,因此系統(tǒng)會(huì)優(yōu)先分配地址值較大的字節(jié)給變量。由于是先定義變量a、后定義變量b,因此你會(huì)看到變量a的地址ffc5比變量b的地址ffc1大。
  • 注意看表格中變量b存儲(chǔ)的內(nèi)容,變量b的二進(jìn)制 形式是:0000 0000 0000 0000 0000 0000 0000 1010 。由于內(nèi)存尋址是從大到小的,所以是從內(nèi)存地址最大的字節(jié)開始存儲(chǔ)數(shù)據(jù),存放順序是ffc4 -> ffc3 -> ffc2 -> ffc1,所以把前面的0000 0000都放在ffc2~ffc4中,最后面的八位0000 1010放在ffc1中。

4.查看變量的內(nèi)存地址

在調(diào)試過程中,我們經(jīng)常會(huì)采取打印的方式查看變量的地址

      
        1
      
       #include <stdio.h>

      
        2
      
      
        3
      
      
        int
      
      
         main()

      
      
        4
      
      
        {

      
      
        5
      
      
        int
      
       a = 
      
        10
      
      
        ;

      
      
        6
      
           printf(
      
        "
      
      
        變量a的地址是:%p
      
      
        "
      
      , &
      
        a);

      
      
        7
      
      
        return
      
      
        0
      
      
        ;

      
      
        8
      
       }
    

第6行中的&是一個(gè)地址運(yùn)算符,&a表示取得變量a的地址。格式符%p是專門用來輸出地址的。輸出結(jié)果是:

      變量a的地址是:
      
        0x7fff5fbff8f8
      
    

這個(gè)0x7fff5fbff8f8就是變量a的內(nèi)存地址

三、負(fù)數(shù)的二進(jìn)制形式

      
        1
      
      
        int
      
      
         main()

      
      
        2
      
      
        {

      
      
        3
      
      
        int
      
       b = -
      
        10
      
      
        ;

      
      
        4
      
      
        return
      
      
        0
      
      
        ;

      
      
        5
      
       } 
    

在第3行定義了一個(gè)整型變量,它的值是-10。-10在內(nèi)存中怎樣存儲(chǔ)的呢?其實(shí)任何數(shù)值在內(nèi)存中都是以補(bǔ)碼的形式存儲(chǔ)的。

  • 正數(shù)的補(bǔ)碼與原碼相同。比如9的原碼和補(bǔ)碼都是1001
  • 負(fù)數(shù)的補(bǔ)碼等于它正數(shù)的原碼取反后再+1。 (取反的意思就是0變1、1變0)

那么-10的補(bǔ)碼計(jì)算過程如下:

1> 先算出10的二進(jìn)制形式 :0000 0000 0000 0000 0000 0000 0000 1010

2> 對(duì)10的二進(jìn)制進(jìn)行取反: 1111 1111 1111 1111 1111 1111 1111 0101

3> 對(duì)取反后的結(jié)果+1: 1111 1111 1111 1111 1111 1111 1111 0110

因此,整數(shù)-10在內(nèi)存中的二進(jìn)制形式是: 1111 1111 1111 1111 1111 1111 1111 0110

【C語言】06-變量與內(nèi)存

四、變量的作用域

1.作用域簡(jiǎn)介

變量的作用域就是指變量的作用范圍。先來看看下面的程序:

      
        1
      
      
        int
      
      
         main()

      
      
        2
      
      
        {

      
      
        3
      
      
        int
      
       a = 
      
        7
      
      
        ;

      
      
        4
      
      
        5
      
      
        return
      
      
        0
      
      
        ;

      
      
        6
      
       }
    
  • 在第3行定義了一個(gè)變量a,當(dāng)執(zhí)行到這行代碼時(shí),系統(tǒng)就會(huì)為變量a分配存儲(chǔ)空間
  • 當(dāng)main函數(shù)執(zhí)行完畢,也就是執(zhí)行完第5行代碼了,變量a所占用的內(nèi)存就會(huì)被系統(tǒng)自動(dòng)回收
  • 因此,變量a的作用范圍是從定義它的那行開始,一直到它所在的大括號(hào){}結(jié)束,也就是第3~6行,一旦離開這個(gè)范圍,變量a就失效了

2.代碼塊

1> 代碼塊其實(shí)就是用大括號(hào){}括住的一塊代碼。

      
         1
      
      
        int
      
      
         main()

      
      
         2
      
      
        {

      
      
         3
      
      
            {

      
      
         4
      
      
        int
      
       a = 
      
        10
      
      
        ;

      
      
         5
      
      
         6
      
               printf(
      
        "
      
      
        a=%d
      
      
        "
      
      
        , a);

      
      
         7
      
      
            }

      
      
         8
      
      
         9
      
           a = 
      
        9
      
      
        ;

      
      
        10
      
      
        11
      
      
        return
      
      
        0
      
      
        ;

      
      
        12
      
       }
    
  • 注意第3~7行的大括號(hào),這就是一個(gè)代碼塊
  • 當(dāng)執(zhí)行到第4行時(shí),系統(tǒng)會(huì)分配內(nèi)存給變量a
  • 當(dāng)代碼塊執(zhí)行完畢,也就是執(zhí)行完第6行代碼后,變量a所占用的內(nèi)存就會(huì)被系統(tǒng)回收
  • 因此,變量a的作用范圍是從定義它的那行開始,一直到它所在的大括號(hào){}結(jié)束,也就是第4~7行,離開這個(gè)范圍,變量a就失效了
  • 所以,上面的程序是編譯失敗的,第9行代碼是錯(cuò)誤的,變量a在第7行的時(shí)候已經(jīng)失效了,不可能在第9行使用

2> 如果是下面這種情況

      
         1
      
      
        int
      
      
         main()

      
      
         2
      
      
        {

      
      
         3
      
      
        int
      
       a = 
      
        9
      
      
        ;

      
      
         4
      
      
         5
      
      
            {

      
      
         6
      
      
        int
      
       a = 
      
        10
      
      
        ;

      
      
         7
      
      
         8
      
               printf(
      
        "
      
      
        a=%d
      
      
        "
      
      
        , a);

      
      
         9
      
      
            }

      
      
        10
      
      
        11
      
      
        return
      
      
        0
      
      
        ;

      
      
        12
      
       }
    
  • 注意第3、6行,各自定義了一個(gè)變量a,這種情況是沒問題的。C語言規(guī)定:在不同作用域中允許有同名變量,系統(tǒng)會(huì)為它們分配不同的存儲(chǔ)空間。
  • 在第3行定義的變量a的作用域是:第3~12行;在第6行定義的變量a的作用域是:第6~9行。
  • 最后注意第8行:嘗試輸出變量a的值。那這里輸出的是哪一個(gè)變量a呢?先看輸出結(jié)果:
      a=
      
        10
      
    

這里采取的是“就近原則”,也就是第8行訪問的是在第6行定義的變量a,并不是在第3行的變量a。

五、變量的初始化

變量在沒有進(jìn)行初始化之前,不要拿來使用,因?yàn)樗锩娲鎯?chǔ)的是一些垃圾數(shù)據(jù)

      
        1
      
       #include <stdio.h>

      
        2
      
      
        3
      
      
        int
      
      
         main()

      
      
        4
      
      
        {

      
      
        5
      
      
        int
      
      
         c;

      
      
        6
      
      
        7
      
           printf(
      
        "
      
      
        %d
      
      
        "
      
      
        , c);

      
      
        8
      
      
        return
      
      
        0
      
      
        ;

      
      
        9
      
       }
    

注意第5行的變量c,只是定義了變量,并沒有給它賦初值。輸出結(jié)果:

      
        1606422622
      
    

可以發(fā)現(xiàn),變量c里面存儲(chǔ)的是一些亂七八糟的數(shù)據(jù)

【C語言】06-變量與內(nèi)存


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 岗巴县| 张家川| 莎车县| 循化| 大埔区| 南川市| 临澧县| 罗田县| 平江县| 福鼎市| 汉沽区| 阿克苏市| 区。| 镇江市| 丰宁| 庐江县| 文昌市| 娱乐| 项城市| 蒙自县| 台中县| 顺平县| 泗水县| 汉寿县| 陆河县| 防城港市| 阜康市| 禄丰县| 谢通门县| 庆阳市| 和田县| 剑川县| 许昌县| 黄山市| 福州市| 成安县| 西昌市| 格尔木市| 阜南县| 祁连县| 铁岭县|