第四章指針、結(jié)構(gòu)、聯(lián)合和枚舉

字號(hào):

本章專門對(duì)第二節(jié)曾講述過(guò)的指針作一詳述。并介紹Turbo C新的數(shù)據(jù)類型:
    結(jié)構(gòu)、聯(lián)合和枚舉, 其中結(jié)構(gòu)和聯(lián)合是以前講過(guò)的五種基本數(shù)據(jù)類型(整型、浮
    點(diǎn)型、字符型、指針型和無(wú)值型)的組合。 枚舉是一個(gè)被命名為整型常數(shù)的集合。
    最后對(duì)類型說(shuō)明(typedef)和預(yù)處理指令作一闡述。
    指 針(point)
    學(xué)習(xí)Turbo C語(yǔ)言, 如果你不能用指針編寫有效、正確和靈活的程序, 可以
    認(rèn)為你沒(méi)有學(xué)好C語(yǔ)言。指針、地址、數(shù)組及其相互關(guān)系是C語(yǔ)言中最有特色的部
    分。規(guī)范地使用指針, 可以使程序達(dá)到簡(jiǎn)單明了, 因此, 我們不但要學(xué)會(huì)如何正
    確地使用指針, 而且要學(xué)會(huì)在各種情況下正確地使用指針變量。
    1. 指針和地址
    1.1 指針基本概念及其指針變量的定義
    1.1.1 指針變量的定義
    我們知道變量在計(jì)算機(jī)內(nèi)是占有一塊存貯區(qū)域的, 變量的值就存放在這塊區(qū)
    域之中, 在計(jì)算機(jī)內(nèi)部, 通過(guò)訪問(wèn)或修改這塊區(qū)域的內(nèi)容來(lái)訪問(wèn)或修改相應(yīng)的變
    量。Turbo C語(yǔ)言中, 對(duì)于變量的訪問(wèn)形式之一, 就是先求出變量的地址, 然后
    再通過(guò)地址對(duì)它進(jìn)行訪問(wèn), 這就是這里所要論述的指針及其指針變量。
    所謂變量的指針, 實(shí)際上指變量的地址。變量的地址雖然在形式上好象類似
    于整數(shù), 但在概念上不同于以前介紹過(guò)的整數(shù), 它屬于一種新的數(shù)據(jù)類型, 即指
    針類型。Turbo C中, 一般用"指針"來(lái)指明這樣一個(gè)表達(dá)式&x的類型, 而用 "地
    址"作為它的值, 也就是說(shuō), 若x為一整型變量, 則表達(dá)式&x的類型是指向整數(shù)的
    指針, 而它的值是變量x的地址。同樣, 若
    double d;
    則&d的類型是指向以精度數(shù)d的指針, 而&d的值是雙精度變量d的地址。所以, 指
    針和地址是用來(lái)敘述一個(gè)對(duì)象的兩個(gè)方面。雖然&x、&d的值分別是整型變量x 和
    雙精度變量d的地址, 但&x、&d的類型是不同的, 一個(gè)是指向整型變量x的指針,
    而另一個(gè)則是指向雙精度變量d的指針。在習(xí)慣上, 很多情況下指針和地址這兩
    個(gè)術(shù)語(yǔ)混用了。
    我們可以用下述方法來(lái)定義一個(gè)指針類型的變量。
    int *ip;
    首先說(shuō)明了它是一指針類型的變量, 注意在定義中不要漏寫符號(hào)"*", 否則它為
    一般的整型變量了。另外, 在定義中的int 表示該指針變量為指向整型數(shù)的指針
    類型的變量, 有時(shí)也可稱ip為指向整數(shù)的指針。ip是一個(gè)變量, 它專門存放整型
    變量的地址。
    指針變量的一般定義為:
    類型標(biāo)識(shí)符 *標(biāo)識(shí)符;
    其中標(biāo)識(shí)符是指針變量的名字, 標(biāo)識(shí)符前加了"*"號(hào), 表示該變量是指針變
    量, 而最前面的"類型標(biāo)識(shí)符"表示該指針變量所指向的變量的類型。一個(gè)指針變
    量只能指向同一種類型的變量, 也就是講, 我們不能定義一個(gè)指針變量, 既能指
    向一整型變量又能指向雙精度變量。
    指針變量在定義中允許帶初始化項(xiàng)。如:
    int i, *ip=&i;
    注意, 這里是用&i對(duì)ip初始化, 而不是對(duì)*ip初始化。和一般變量一樣, 對(duì)于外
    部或靜態(tài)指針變量在定義中若不帶初始化項(xiàng), 指針變量被初始化為NULL, 它的值
    為0。Turbo C中規(guī)定, 當(dāng)指針值為零時(shí), 指針不指向任何有效數(shù)據(jù), 有時(shí)也稱指
    針為空指針。因此, 當(dāng)調(diào)用一個(gè)要返回指針的函數(shù)(第五節(jié)中介紹)時(shí), 常使用返
    回值為NULL來(lái)指示函數(shù)調(diào)用中某些錯(cuò)誤情況的發(fā)生。
    1.1.2 指針變量的引用
    既然在指針變量中只能存放地址, 因此, 在使用中不要將一個(gè)整數(shù)賦給一指
    針變量。下面的賦值是不合法的:
    int *ip;
    ip=100;
    假設(shè)
    int i=200, x;
    int *ip;
    我們定義了兩個(gè)整型變量i, x, 還定義了一個(gè)指向整型數(shù)的指針變量ip。i, x中
    可存放整數(shù), 而ip中只能存放整型變量的地址。我們可以把i的地址賦給ip:
    ip=&i;
    此時(shí)指針變量ip指向整型變量i, 假設(shè)變量i的地址為1800, 這個(gè)賦值可形象理解
    為下圖所示的聯(lián)系。
    ip i
    ┏━━━┓ ┏━━━┓
    ┃ 1800 ╂──→ ┃ 200 ┃