指標變數同普通變數一樣,使用之前不僅要定義說明,而且必須賦予具體的值。未經賦值的指標變數不能使用,否則將造成系統混亂,甚至宕機。指標變數的賦值只能賦予位址,決不能賦予任何其它資料,否則將引起錯誤。在c語言中,變數的位址是由編譯系統分配的,對使用者完全透明,使用者不知道變數的具體位址。
兩個有關的運算子:
&:取位址運算子。
*:指標運算子(或稱「間接訪問」 運算子)。
如&a表示變數a的位址,&b表示變數b的位址。變數本身必須預先說明。
1、指標變數初始化的方法
int a;
int *p=&a;
2、賦值語句的方法
int a;
int *p;
p=&a;
不允許把乙個數賦予指標變數,故下面的賦值是錯誤的:
int *p;
p=1000;
被賦值的指標變數前不能再加「*」說明符,如寫為*p=&a 也是錯誤的。假設:
int i=200, x;
int *ip;
此時指標變數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++*/
main()
對程式的說明:
在開頭處雖然定義了兩個指標變數pointer_1和pointer_2,擔它們並未指向任何乙個整型變數。只是提供兩個指標變數,規定它們可以指向整型變數。程式第5、6行的作用就是使pointer_1指向a,pointer_2指向b。
最後一行的*pointer_1和*pointer_2就是變數a和b。最後兩個printf函式作用是相同的。
程式中有兩處出現*pointer_1和*pointer_2,請區分它們的不同含義。
程式第5、6行的「pointer_1=&a」和 「pointer_2=&b」不能寫成「*pointer_1=&a」和 「*pointer_2=&b」。
黑馬程式設計師 C語言基礎
ios培訓 android培訓 期待與您交流!一 c語言的流程控制 1 順序結構 按照程式的書寫順序執行每一條語句 2 選擇結構 對給定的條件進行判斷,再根據判斷結果來決定執行哪一段 2.1 if語句 1 if的第一種結構 if 條件 eg include int main return 0 2 i...
黑馬程式設計師 C語言基礎
asp.net unity開發 net培訓 期待與您交流!c語言算數運算子 1.2.3.4.5.int a 10,b 20 printf 兩個差 d b a printf 兩個和 d b a printf 兩個積 d b a printf 兩個商 d b a printf 兩個餘 d b a 小技巧...
黑馬程式設計師 C語言基礎
asp.net unity開發 net培訓 期待與您交流!簡介 c語言於1972年發明,首次使用是用於重寫uinx作業系統。隨著unix作業系統的成功,c語言也得到了大幅度地推廣,是世界上最流行 使用最廣泛的高階程式語言之一。基礎語法 關鍵字 1 關鍵字就是c語言提供的有特殊含義的符號,也叫做 保留...