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

字號:

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