指標是c語言的精華部分,通過利用指標,我們能很好地利用記憶體資源,使其發揮最大的效率。有了指標技術,我們可以描述複雜的資料結構,對字串的處理可以更靈活,對陣列的處理更方便,使程式的書寫簡潔,高效,清爽。但由於指針對初學者來說,難於理解和掌
握,需要一定的計算機硬體的知識做基礎,這就需要多做多練,多上機動手,才能在實踐中盡快把握,成為c的高手。
過去,我們在程式設計中定義或說明變數,編譯系統就為已定義的變數分配相應的記憶體單元,也就是說,每個變數在記憶體會有固定的位置,有具體的位址。由於變數的資料型別不同,它所佔的記憶體單元數也不相同。若我們在程式中做定義為:
int a=1,b=2;
float x=3.4, y = 4 . 5 ;
double m=3.124;
char ch1='a', ch2='b';
讓我們先看一下編譯系統是怎樣為變數分配記憶體的。變數a,b是整型變數,在記憶體各佔2個位元組;x,y是實型,各佔4個位元組;m是雙精度實型,佔8個位元組;ch1,ch2是字元型,各佔1個位元組。由於計算機記憶體是按位元組編址的,設變數的存放從記憶體2000單元開始存放,則編譯系統對變數在記憶體的安放情況為圖6-1所示。
變數在記憶體中按照資料型別的不同,佔記憶體的大小也不同,都有具體的記憶體單元位址,如變數a在記憶體的位址是2000,佔據兩個位元組後,
變數b的記憶體位址就為2002,變數m的記憶體位址為2012等。對記憶體中變數的訪問,過去用scanf("%d%d%f",&a,&b,&x)表示將資料輸入變數的位址所指示的記憶體單元。那麼,訪問變數,首先應找到其在記憶體的位址,或者說,乙個位址唯一指向乙個記憶體變數,我們稱這個位址為
變數的指標。假如將變數的位址儲存在記憶體的特定區域,用變數來存放這些位址,這樣的變數就是指標變數,通過指針對所指向變數的訪問,也就是一種對變數的「間接訪問」。
設一組指標變數pa、pb、px、py、pm、pch1、pch2,分別指向上述的變數a、b、x、y、m、ch1、ch2,指標變數也同樣被存放在記憶體,二者的關係如圖6-2所示:
在圖6-2中,左部所示的記憶體存放了指標變數的值,該值給出的是所指變數的位址,通過該位址,就可以對右部描述的變數進行訪問。如指標變數pa的值為2000,是變數a在記憶體的位址。因此,pa就指向變數a。變數的位址就是指標,存放指標的變數就是指標變數。
同變數的資料型別類似,指標也有型別。之所以指標會有型別,是為了符合對應的變數或常量資料型別。
要注意,指標本身也是一種資料型別。
不同指標型別的本質在於不同的操作。這點和快捷方式是類似的。比如雙擊乙個可執行檔案(.exe)快捷方式的操作是執行這個可執行檔案,而雙擊乙個word文件檔案(.doc)快捷方式的操作是使用word程式開啟這個文件。類似地,乙個字元型資料在記憶體中占用乙個位元組,那麼讀取資料就應以字元型資料讀出乙個位元組;乙個長整型資料在記憶體中占用四個位元組,那麼讀取資料時就應以長整型資料讀出四個位元組。如果指標型別與它所指向的資料型別不匹配,就可能對資料作出錯誤的操作。
指標變數也是一種變數。所以在使用之前,必須先宣告。宣告指標變數的語句格式為:
指標的型別 *指標變數名;
其中,指標型別應該是與指標所指向的資料相符合的資料型別。比如int、char、float等等。*表示所要定義的是乙個指標變數,而不是乙個普通變數。指標變數名則應該遵循起變數名的一切規則。
例如:char *cptr;//指向字元型變數的指標變數
int *iptr;//指向整型變數的指標變數
要注意,當我們要宣告多個指標變數時,必須在每個指標變數名前加上*,例如:
int *iptr1,*iptr2,iptr3;//iptr1和iptr2是指向整型變數的指標變數,而iptr3是整型變數
我們已經宣告了指標變數,那麼我們如何獲得資料在記憶體中的位址呢?
&變數名或常量名
int c=9;
int *iptr=&c;//宣告指向整型變數的指標變數,並作初始化
這時,我們稱指標iptr指向了變數c。在第三章我們說過,宣告乙個未經初始化的變數之後,它的值是無法確定的。所以如果宣告了乙個指標卻不對它作初始化,那麼它所指向的內容也是無法確定的,而這種情況是十分危險的。
沒有初始化的指標變數是危險的。可是如果在宣告變數之後,找不到合適的位址進行初始化,我們該怎麼辦呢?顯然,隨便找個位址對指標變數做初始化是不負責任的。
int *iptr=null;
要注意的是,c++是大小寫敏感的,null與null是不同的。所以,在使用的時候必須要大寫。
雙擊乙個有效的快捷方式,就能夠呼叫對應的檔案,那麼我們通過什麼方法才能操作指標所指向的變數呢?
在這裡,*又出現了,它稱為間接引用操作符。其作用是獲取指標所指向的變數或儲存空間。間接引用的指標可以作為左值。(關於左值概念請參見第三章)具體的使用格式為:
*指標變數名
下面,我們來看一段程式,實踐一下如何使用指標變數:(程式8.2)
#include "iostream.h"
int main()
{int i=3;
int *iptr=&i;
int **iptrptr=&iptr;//iptr也是變數,也能夠獲取它的位址
cout <
1、如果將程式8.2中的所有整型變數換成字元型變數(把對應的變數資料也換成字元),則執行後會有什麼奇怪的現象?請根據第七章的知識,猜想產生這個奇怪現象的原因。
2、如果宣告乙個指標變數後不對其進行初始化,而是將其間接引用,作為左值修改它所指向的記憶體中的資料,會有什麼結果產生?
結論:在沒有保護措施的作業系統中,這樣的操作可能會導致系統錯誤甚至崩潰。
3、能否將乙個常量的位址賦值給乙個對應型別的指標變數?
C 指標 指標變數
三 和 小結 四 指標變數的運算 指標變數 存放指標的變數,本質上是乙個整數。指標所指向的值,可以是任何型別資料,如陣列 字串 函式或普通變數 指標變數。定義指標變數與定義普通變數非常類似,不過要在變數名前面加星號 datatype name 或者 datatype name value 表示這是乙...
C 指標變數
a detailed introduction to c pointer variable,maybe helpful guderian出品 想獲得更佳閱讀體驗?戳 對指標變數的型別說明,一般形式為 型別說明符 變數名 其中,表示這是乙個指標變數,變數名即為定義的指標變數名,型別說明符表示該指標變數...
c語言指標 指標和指標變數
指標是c語言中乙個重要的概念,也是c語言的重要角色。可以說指標是c的精華所在,學習指標雖然不易,但是只要肯花上時間去反覆的理解和實踐,就一定可以很好的掌握它。一 指標是什麼 指標到底是什麼?我們先舉乙個例子。假設我們在火車站 附近開了一家賓館,這家賓館有三千多間屋子,為了方便管理,我們給每個房間都加...