<kbd id="daqct"></kbd>

  • <nav id="daqct"></nav>
    <wbr id="daqct"><pre id="daqct"></pre></wbr>
    <wbr id="daqct"></wbr>
    <form id="daqct"><th id="daqct"></th></form>
    更多課程 選擇中心

    C/C++培訓
    達內IT學院

    400-111-8989

    C語言變量三要素知識詳解,C語言變量三要素沒那么難

    • 發布:C++培訓
    • 來源:學習筆記
    • 時間:2017-06-30 16:02

    1.變量的三要素

    “變量的值”保存在內存的某個地方,如同使用門牌號確定地址一樣,在內存中也給變量分配門牌號。在C的內存世界中,門牌號被稱為變量的地址。即從變量中取值就是通過變量名找到相應的存儲地址,然后讀取該存儲單元中的值,而寫一個變量就是將變量的值存放到與之相應的存儲地址中去。

    通常將用于存儲數據的“位置”稱為對象,當將一個對象看作一個黑盒子時,如果將指定類型的值放入這個盒子,則需要使用一個名字才能訪問一個對象。假設命名后的對象稱為變量iNum,它有特定的類型int,類型決定將什么賦給對象,比如,將0x64賦給int類型變量iNum,以及可以使用的操作,比如,多個int類型數據可以使用“*”操作進行乘法運算。

    如果有以下聲明:

    int     iNum = 0x64;                        // 聲明iNum為int型變量

    其中,int為變量iNum的類型,iNum為變量名,0x64為變量iNum的值。當聲明一個變量時,編譯器會根據變量的類型預留足夠的內存空間。變量的存儲空間是系統自動分配的,但此存儲空間不會在程序的整個生命周期中永遠存在。

    值是被解釋為一個類型的內存中的一組比特(bit)。計算機內存不知道值的類型,只是將它保存起來。因此只有決定內存如何解釋時,內存中的bit才有意義。比如,3.0的含義是什么?只有使用單位時,才會決定3.0的含義。

    聲明是命名一個對象的一條語句,定義是為一個對象分配內存空間的聲明,一個定義通常會提供一個初始值。比如:

    int length = 20;

    int width = 40;

    int area = length + width;

    2.變量的地址與指針

    當你聲明一個變量時,底層會分配一定大小的內存存儲變量的信息。而分配多少內存,則在編譯期就已經確定了。為了能夠訪問無限量的內存,C語言使用地址&操作符返回操作數的地址。當&運算符作用于一個變量時,則返回的是變量的地址。對于變量iNum來說,&iNum就是變量iNum的內存地址,詳見圖 1.3。

    從變量中取值就是通過變量名iNum找到與之相應的存儲地址&iNum,然后讀取存儲在該地址中的值0x64,寫一個變量iNum就是將變量的值0x64存放到與之相應的存儲地址&iNum中去。顯然,不能在&iNum前面再加“&”運算符,因為&iNum已經不是變量了,而是一個不可修改的整型常量,即0x22FF74。

    為了便于描述變量,C語言將用于存儲變量的內存地址的&iNum抽象為指向變量iNum的指針。這些地址之所以稱為指針,因為它是“指向”一個變量的。只需指出變量的地址(不是變量名),就可以確定該變量。即指針的本質就是一個內存的地址,它指向內存的某個位置。指針是一個地址,其強調的是當使用指針時要想到它是“內存地址”。實際上,在現實世界里既沒有變量也沒有指針,變量和指針是對程序中的數據和存儲空間的抽象。

    為了展示變量的地址與變量的值的對應關系,最好的方式是直接打印輸出。比如,輸入2個整數,交換兩者的值后輸出,即先將輸入的整數存入變量iNum1和iNum2,然后交換,詳見程序清單 1.3。注意,不同的編譯環境(不同的編譯器、同一編譯器的不同版本、編譯參數不同等),變量的地址值(0x22FF74)可能會不一樣。

    程序清單 1.3  變量交換范例程序

    1       #include<stdio.h>

    2       int main(int argc, char *argv[])

    3       {

    4                 intiNum1, iNum2, temp;

    5

    6                 scanf("%x%x",&iNum1, &iNum2);

    7                 printf("%x,%x\n", &iNum1, &iNum2);

    8                 printf("%x,%x\n", iNum1, iNum2);

    9                 temp= iNum1;  iNum1 = iNum2;  iNum2 = temp;

    10               printf("%x,%x\n", &iNum1, &iNum2);

    11               printf("%x,%x\n", iNum1, iNum2);

    12               return0;

    13     }

           

    請讀者仔細觀察,為何要在程序清單 1.3(6)中的變量前添加“&”?程序清單 1.3(6~7)中的&iNum1、&iNum2有什么區別?

    左值和右值

    為了理解某些操作符的限制,標準C發明了L-value和R-value兩個名詞。雖然其被解釋為左值和右值,但實際上是一個美麗的誤會。因為L-value是指“locator value”不是“left vaue”,其字面意思是“(在內存中)有特定位置的值”,即內存的索引值——地址。而R-value是指“readvalue”不是“rightvalue”,其字面意思是“可讀的值”。比如:

    int iNum = 0x64;

    雖然編譯器為變量iNum分配了地址(L-value),其L-value是在編譯期就確定了的地址“&iNum”。而R-value是存儲在變量iNum中的值0x64,但其賦值是在運行時。

    盡管iNum有地址,但iNum++表達式沒有地址,因此iNum只有R-value。雖然任何表達式都有R-value,但只有部分表達式有L-value。

    3.變量的存儲

    如果數據從低位到高位用最左位和最右位表述,則一定會產生歧義,因此使用最低有效位(Least Significant,LSB)和最高有效位(Most Significant,MSB)分別表示數據的最低位和最高位。對于有符號數來說,最高有效位就是符號位。假設變量的值用二進制表示為

    D31D30D29D28D27D26D25D24D23D22D21D20D19D18D17D16D15D14D13D12D11D10D9D8D7D6D5D4D3D2D1D0

    即數據的MSB符號位為D31,LSB為D0。

    根據數據中各個字節在連續字節序列中排列順序的不同,分為2種排列方式:大端和小端。如果A中存放的是數據的MSB最高有效位,即為大端模式(詳見圖1.4(a));如果A中存放的是數據的LSB最低有效位,即為小端模式(詳見圖1.4(b))。注意,CPU究竟采用何種存儲模式取決于硬件,與編譯器無關,Intel x86計算機的CPU就是小端模式。當計算機對存儲單元進行編號時,則每個地址編號中只存放一個字節。C規定多字節的int、float、doublie類型變量必須占用相鄰的存儲單元,且將存儲單元的最低地址作為變量的地址。假設一個32位變量占用地址為A、A+1、A+2和A+3存儲單元,則變量的地址為A。如果有“intiNum = 0x64;”,那么A中到底存放的是4個字節00H、00H、00H、64H中的哪個字節呢?

    4.變量類型別名

    大家可能知道,作者的名字叫周立功,但作者在家里還有一個別名——小兵,其實都是同一個人。同樣如此,我們也可以給變量的類型取一個別名。如果在“int iNum;”定義前添加typedef,即:

    typedef int iNum;

    此時,iNum等同于int類型。為了便于理解,將iNum替換成INT32。比如:

    typedef int INT32;

    typedef的用途是聲明類型的別名,它只是為某個已經存在的類型增加了一個新的名字。那么利用這一特性,就可以定義變量了。比如:

    INT32  a;                                  //定義int型變量a

    除此之外,INT32還可用于類型轉換,比如:

    float b;

    (INT32)b;                               // 將其它的類型b轉換為整型

    為何還要為int再取一個名稱呢?主要是為了提高程序的可移植性。比如,某種微處理器的int為16位,long為32位。如果要將該程序移植到另一種體系結構的微處理器,假設其int為32位,long為64位,而只有short才是16位的,因此必須將程序中的int全部替換為short,long全部替換為int,不僅修改工作量巨大且容易出錯。如果在程序中全部用新取的名稱,那么只需要修改定義的這些新名稱。即只要將以前的:

    typedef int INT16;

    typedef long INT32;

    替換成:

    typedefshort INT16;

    typedef int INT32;

    在編程中使用typedef的好處,除了為變量取一個簡單易記且意義明確的新名稱之外,其最主要的作用是使用typedef構造新的數據類型。而不要誤認為typedef的作用僅僅是簡化更復雜的類型聲明,將在后續的章節中詳細闡述。

    由此可見,C語言變量的內涵包括3個要素:變量的類型、變量的值和變量的地址。

    • 變量的類型:即變量存儲的數據的類型,程序如何解釋變量保存的數據。比如,int類型變量,任何引用存儲在變量中的數據都被程序解釋為整數。數據類型分為基本類型(字符型與數值型)、構造類型(數組型、結構體型、聯合體型、枚舉型與位域型)、指針類型與void *類型,所有其它的類型都是通過組合的方式從基本類型構造而來的。

    • 變量的值:程序根據變量的類型解釋存儲在變量中的數據,數據分為不可修改的常量的值和可以修改的變量的值。

    • 變量的地址:即變量在內存中的位置,當利用一個變量存儲一個數據時,則程序將數據存儲到變量的地址所指示的存儲單元中。

    預約申請免費試聽課

    填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

    上一篇:C++與JAVA編程語言的核心區別
    下一篇:程序員快速成長秘笈,程序員成長框架分享

    C語言創建windows窗口實例

    C++回調函數是什么?

    C++ shared_ptr和動態數組

    C語言有哪些關鍵詞,C語言44個關鍵詞大全

    • 掃碼領取資料

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    黑龍江省

    吉林省

    河北省

    湖南省

    貴州省

    云南省

    廣西省

    海南省

    欧美三级片,白洁外传,第四色播日韩AV第一页,啪啪免费观看大全av 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>