指針變量作為函數參數

  • 2017-09-04
  • 90

西安做網站 指針變量作為函數參數

函數的參數不僅可以是整型、實型、字符型等數據,還可以是指針類型。它的作用是將一個變量的地址傳送到另一個函數中。

【例10.3】題目同例10.2,即輸入的兩個整數按大小順序輸出。今用函數處理,而且用指針類型的數據作函數參數。

swap(int *p1,int *p2)

{int temp;

 temp=*p1;

 *p1=*p2;

 *p2=temp;

}

main()

{

int a,b;

int *pointer_1,*pointer_2;

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

  pointer_1=&a;pointer_2=&b;

  if(a<b) swap(pointer_1,pointer_2);

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

  }

 

對程序的說明:

swap是用戶定義的函數,它的作用是交換兩個變量(a和b)的值。swap函數的形參p1、p2是指針變量。程序運行時,先執行main函數,輸入a和b的值。然後將a和b的地址分別賦給指針變量pointer_1和pointer_2,使pointer_1指向a,pointer_2指向b。

 

接著執行if語句,由於a〈b,因此執行swap函數。注意實參pointer_1和pointer_2是指針變量,在函數調用時,將實參變量的值傳遞給形參變量。采取的依然是值傳遞方式。因此虛實結合後形參p1的值為&a,p2的值為&b。這時p1和pointer_1指向變量a,p2和pointer_2指向變量b。

 

接著執行執行swap函數的函數體使*p1和*p2的值互換,也就是使a和b的值互換。

 

函數調用結束後,p1和p2不複存在(已釋放)如圖。

 

最後在main函數中輸出的a和b的值是已經過交換的值。

請注意交換*p1和*p2的值是如何實現的。請找出下列程序段的錯誤:

swap(int *p1,int *p2)

{int *temp;

 *temp=*p1;      /*此語句有問題*/

 *p1=*p2;

 *p2=temp;

}

請考慮下麵的函數能否實現實現a和b互換。

swap(int x,int y)

{int temp;

 temp=x;

 x=y;

 y=temp;

}

如果在main函數中用swap(a,b);調用swap函數,會有什麽結果呢?請看下圖所示。

 

【例10.4】請注意,不能企圖通過改變指針形參的值而使指針實參的值改變。

swap(int *p1,int *p2)

{int *p;

 p=p1;

 p1=p2;

 p2=p;

}

main()

{

int a,b;

int *pointer_1,*pointer_2;

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

  pointer_1=&a;pointer_2=&b;

  if(a<b) swap(pointer_1,pointer_2);

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

  }

 

其中的問題在於不能實現如圖所示的第四步(d)。

 

【例10.5】輸入a、b、c3個整數,按大小順序輸出。

swap(int *pt1,int *pt2)

{int temp;

 temp=*pt1;

 *pt1=*pt2;

 *pt2=temp;

}

exchange(int *q1,int *q2,int *q3)

{ if(*q1<*q2)swap(q1,q2);

if(*q1<*q3)swap(q1,q3);

if(*q2<*q3)swap(q2,q3);

}

main()

{

int a,b,c,*p1,*p2,*p3;

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

  p1=&a;p2=&b; p3=&c;

  exchange(p1,p2,p3);

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

  }

 

西安網站

指針變量作為函數參數——西安做網站-www.xgktgj.com