指針變量的引用

  • 2017-08-31
  • 74

西安網站製作 指針變量的引用

指針變量同普通變量一樣,使用之前不僅要定義說明,而且必須賦予具體的值。未經賦值的指針變量不能使用,否則將造成係統混亂,甚至死機。指針變量的賦值隻能賦予地址, 決不能賦予任何其它數據,否則將引起錯誤。在C語言中,變量的地址是由編譯係統分配的,對用戶完全透明,用戶不知道變量的具體地址。

兩個有關的運算符:

&:取地址運算符。

*:指針運算符(或稱間接訪問 運算符)。

C語言中提供了地址運算符&來表示變量的地址。

其一般形式為:

    &變量名;

&a表示變量a的地址,&b表示變量b的地址。變量本身必須預先說明。

設有指向整型變量的指針變量p,如要把整型變量a 的地址賦予p可以有以下兩種方式:

指針變量初始化的方法

  int a;

    int *p=&a;

賦值語句的方法

    int a;

    int *p;

p=&a;

不允許把一個數賦予指針變量,故下麵的賦值是錯誤的:

int *p;

p=1000;

被賦值的指針變量前不能再加“*說明符,如寫為*p=&a 也是錯誤的。

假設:

int i=200, x;

int *ip;

AG娛樂定義了兩個整型變量i,x,還定義了一個指向整型數的指針變量ip。i,x中可存放整數,而ip中隻能存放整型變量的地址。AG娛樂可以把i的地址賦給ip:

ip=&i;

此時指針變量ip指向整型變量i,假設變量i的地址為1800,這個賦值可形象理解為下圖所示的聯係。

 

  以後AG娛樂便可以通過指針變量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;",前者不僅速度慢而且目的不明。但由於指針是變量,AG娛樂可以通過改變它們的指向,以間接訪問不同的變量,這給程序員帶來靈活性,也使程序代碼編寫得更為簡潔和有效。

指針變量可出現在表達式中, 設

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++*/

【例10.1】

main()

{ int a,b;

  int *pointer_1, *pointer_2;

  a=100;b=10;

  pointer_1=&a;

pointer_2=&b;

  printf("%d,%d\n",a,b);

  printf("%d,%d\n",*pointer_1, *pointer_2);

}

 

對程序的說明:

在開頭處雖然定義了兩個指針變量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

請對下麵再的關於“&*的問題進行考慮:

如果已經執行了“pointer_1=&a;語句,則&*pointer_1是什麽含義?

*&a含義是什麽?

(pointer_1)++和pointer_1++的區別?

【例10.2】輸入a和b兩個整數,按先大後小的順序輸出a和b。

main()

{ int *p1,*p2,*p,a,b;

  scanf("%d,%d",&a,&b);

  p1=&a;p2=&b;

  if(a<b)

    {p=p1;p1=p2;p2=p;}

  printf("\na=%d,b=%d\n",a,b);

  printf("max=%d,min=%d\n",*p1, *p2);

西安網站製作

}

 


指針變量的引用——西安做網站-www.xgktgj.com