指標變數同普通變數一樣,使用之前不僅要定義說明,而且必須賦予具體的值。未經賦值的指標變數不能使用,否則將造成系統混亂,甚至宕機。指標變數的賦值只能賦予位址,決不能賦予任何其它資料,否則將引起錯誤。在c語言中,變數的位址是由編譯系統分配的,對使用者完全透明,使用者不知道變數的具體位址。
兩個有關的運算子:
1) &:取位址運算子。
2) *:指標運算子(或稱「間接訪問」 運算子)。
c語言中提供了位址運算子&來表示變數的位址。
其一般形式為:
&變數名;
如&a表示變數a的位址,&b表示變數b的位址。變數本身必須預先說明。
設有指向整型變數的指標變數p,如要把整型變數a 的位址賦予p可以有以下兩種方式:
(1) 指標變數初始化的方法
int a;(2) 賦值語句的方法int *p=&a;
int a;不允許把乙個數賦予指標變數,故下面的賦值是錯誤的:int *p;
p=&a;
int *p;被賦值的指標變數前不能再加「*」說明符,如寫為*p=&a 也是錯誤的。p=1000;
假設:
int i=200, x;我們定義了兩個整型變數i,x,還定義了乙個指向整型數的指標變數ip。i,x中可存放整數,而ip中只能存放整型變數的位址。我們可以把i的位址賦給ip:int *ip;
ip=&i;此時指標變數ip指向整型變數i,假設變數i的位址為1800,這個賦值可形象理解為下圖所示的聯絡。
以後我們便可以通過指標變數ip間接訪問變數i,例如:
x=*ip;運算子*訪問以ip為位址的存貯區域,而ip中存放的是變數i的位址,因此,*ip訪問的是位址為1800的存貯區域(因為是整數,實際上是從1800開始的兩個位元組),它就是i所占用的存貯區域, 所以上面的賦值表示式等價於
x=i;另外,指標變數和一般變數一樣,存放在它們之中的值是可以改變的,也就是說可以改變它們的指向,假設
int i,j,*p1,*p2;則建立如下圖所示的聯絡:i='a';
j='b';
p1=&i;
p2=&j;
這時賦值表示式:
p2=p1就使p2與p1指向同一物件i,此時*p2就等價於i,而不是j,圖所示:
如果執行如下表示式:
*p2=*p1;則表示把p1指向的內容賦給p2所指的區域, 此時就變成圖所示
通過指標訪問它所指向的乙個變數是以間接訪問的形式進行的,所以比直接訪問乙個變數要費時間,而且不直觀,因為通過指標要訪問哪乙個變數,取決於指標的值(即指向),例如"*p2=*p1;"實際上就是"j=i;",前者不僅速度慢而且目的不明。但由於指標是變數,我們可以通過改變它們的指向,以間接訪問不同的變數,這給程式設計師帶來靈活性,也使程式**編寫得更為簡潔和有效。
指標變數可出現在表示式中, 設
int x,y,*px=&x;指標變數px指向整數x,則*px可出現在x能出現的任何地方。例如:
y=*px+5; /*表示把x的內容加5並賦給y*/y=++*px; /*px的內容加上1之後賦給y,++*px相當於++(*px)*/
y=*px++; /*相當於y=*px; px++*/
C 中的指標 指標變數以及指向指標的指標
隨著對指標的深入學習,不定期更新指標指標 指向變數物理儲存位址。指標變數 儲存指標的物理變數。由於指標僅儲存首實體地址,故不同類的變數需要不同型別的指標來區別所指變數的長度。pointer i 將 i 的位址存入pointer 兩者相同型別 pointer pointer所儲存的位址中儲存的值。in...
C 指標 指標變數
三 和 小結 四 指標變數的運算 指標變數 存放指標的變數,本質上是乙個整數。指標所指向的值,可以是任何型別資料,如陣列 字串 函式或普通變數 指標變數。定義指標變數與定義普通變數非常類似,不過要在變數名前面加星號 datatype name 或者 datatype name value 表示這是乙...
深入解讀C 中的指標變數
指標變數是一種特殊的變數,它和以前學過的其他型別的變數的不同之處是 用它來指向另乙個變數。為了表示指標變數和它所指向的變數之間的聯絡,在c 中用 符號表示指向,例如,i pointer是乙個指標變數,而 i pointer表示i pointer所指向的變數。下面兩個語句作用相同 i 3 i poin...