欢迎来到天天文库
浏览记录
ID:8082024
大小:432.64 KB
页数:24页
时间:2018-03-05
《的定义及初始值设定》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、7.2指標變數的定義及初始值設定什麼是指標變數?指標是代表記憶體位址的變數。通常一個變數都會存放某個特定的數值(見圖7.1-1)。而指標卻是存放某個變數的位址(見圖7.1-2)。依此而論,我們可以說一個變數名稱直接(directly)參照一個值(見圖7.1-3),而一個指標間接(indirectly)參照這個值(見圖7.1-4)。透過指標來參照某個值稱為間接參照。圖7.1-1圖7.1-2圖7.1-3圖7.1-4指標變數的宣告指標和其他變數一樣,必須在使用之前進行宣告。以下的宣告int*iPtr,foo;指定變數iPtr的型別
2、為int*(也就是指向整數的指標),並且讀作「iPtr是指向int的指標」或「iPtr指向型別為int的物件」。此外,變數foo宣告為int型別,而非指向int的指標。在這個宣告中,*只作用於iPtr,而不作用於foo。如果要將iPtr和foo都宣告成int指標,必須分別使用星號(*),如下:CHowtoProgram–chap7Pointer1int*iPtr,*foo;當*用於宣告中時,表示此變數宣告為指標。指標可以宣告為指向任何型別的物件。在指標名稱中使用ptr三個字將ptr這三個字母放到指標變數的名稱中,可清楚表示這
3、個變數是一個指標,程式必須要謹慎處理它們。例如:double*dPtr,*fooPtr,*barPtr;指標的初始值指標應該在宣告時設定初始值,或用指定敘述式來為他們設定初始值。指標的初始值可以設定成NULL,0或某個位址。•NULL:NULL是一個常數,具有NULL的指標不指向任何東西。•0:將指標初始化為0與初始化為NULL是一樣的,但是使用NULL較佳。•某個位址:將其他變數的位址設定給指標,可以讓指標指向這個變數,如圖7.1所示。NULL常數定義在哪裡?NULL是定義在標頭檔中的符號常數(幾個其他
4、標頭檔含括了標頭,例如)。雖然0是個整數值,它卻可以直接設定給任何指標變數。因為將0設給指標時,它會先轉換成適當型別的指標。為指標變數設定初始值的範例如下:int*iPtr=NULL;/*在宣告時同時設定初始值*/char*cPtr;cPtr=0;/*以指定敘述式設定初始值*/請為指標設定初始值,以避免非預期的結果產生。CHowtoProgram–chap7Pointer27.3指標運算子&運算子&運算子,或稱為取址運算子(addressoperator),用來取得變數的位址。舉例來說,
5、我們宣告變數如下:inta=5;int*aPtr;以下的敘述式aPtr=&a;會將變數a的位址指定給指標變數aPtr。這時,就可以說aPtr「指向」a,或者說aPtr「間接參照」a的值。執行這個敘述以後,我們可以如圖7.2般表示「aPtr指向a」這個關係。圖7.2指標aPtr指向變數a間接參照透過指標參照另一個變數的值,稱為「間接參照」。圖7.3為指標在記憶體內的表示圖,圖中假設整數變數a存放在位置600000,指標變數aPtr存放在位置500000,而aPtr的內容儲存著變數a的位址。取址運算子&的運算元必須是一個變數;取
6、址運算子不能用於常數或運算式。運算子&用來取得變數的位址,因此它的運算元必須是在記憶體中佔有固定位址的變數,而常數或運算式在記憶體中不佔有固定的位址,因此不能以&取得其位址。圖7.3a和aPtr的記憶體表示圖CHowtoProgram–chap7Pointer3*運算子*是一個間接取值運算子(indirectionoperator),或稱解參照運算子(dereferencingoperator),它會傳回其運算元(某個指標)所指的變數的值。承續上面的範例,下列敘述式printf("%d",*aPtr);將會印出變數a的值,也
7、就是5。以這種方式來使用*就稱為「將指標解參照」(dereferencingapointer)。這種方式也可用於等號的左邊,如下列敘述可將變數a的值改為10。*aPtr=10;謹慎使用*於指標上指標若沒有正確初始化或沒有指定為指向記憶體特定位置,對這個指標進行解參照時會發生錯誤。有可能是嚴重的執行時期錯誤而中止程式,或程式看似正常執行完畢,卻意外更改了重要的資料而得到錯誤的結果。指標變數使用範例圖7.4說明&和*指標運算子的使用方法。在大多數的平台中,printf內的轉換指定%p會將記憶體位址以十六進制數印出。程式中,在將指
8、標aPtr指向a之後,a的值是5,而aPtr的值則等於a的位址。透過*aPtr可以得到a的值,也就是5。在第18列中使用*aPtr來修改a的值,最後印出的結果顯示a已經由5變成10了。&與*互補&和*這兩個運算子彼此是互補的--&*aPtr和*&aPtr的意義相同,都等於aPtr本身。圖7
此文档下载收益归作者所有