黑馬程式設計師 c語言基礎語法(二)

2022-08-21 11:51:11 字數 1797 閱讀 7878

指標變數同普通變數一樣,使用之前不僅要定義說明,而且必須賦予具體的值。未經賦值的指標變數不能使用,否則將造成系統混亂,甚至宕機。指標變數的賦值只能賦予位址,決不能賦予任何其它資料,否則將引起錯誤。在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語言提供的有特殊含義的符號,也叫做 保留...