天天看點

【圖解】指針實作兩個整數降序輸出(企圖改變指針形參的值來改變指針實參的值)

用指針變量作為函數參數的方式:

主函數

int main(){
	void swap1(int *p1,int *p2);
	void swap2(int *p1,int *p2);
	int *point_1,*point_2,a,b;
	printf("請輸入a、b:");
	scanf("%d,%d",&a,&b);
	point_1=&a;point_2=&b;
	if(a<b){
		swap2(point_1,point_2);
		//用swap1得不到想要的結果
	}
	printf("a=%d,b=%d\n",a,b);
	printf("*point_1=%d,*point_2=%d\n",*point_1,*point_2);
}
           

swap1函數:

//這種就是企圖改變指針形參的值來改變指針實參的值
void swap1(int *p1,int *p2){
	int *p;
	p=p1;
	p1=p2;
	p2=p;	
}
           

swap2函數:

void swap2(int *p1,int *p2){
	int temp;
	temp=*p1;
	*p1=*p2;
	*p2=temp;
}
           

若是用swap1函數的話:

輸出結果:(要實作兩個整數的降序輸出)

【圖解】指針實作兩個整數降序輸出(企圖改變指針形參的值來改變指針實參的值)

顯然,這個結果不是我想要的結果

若是用swap2函數的話:

輸出結果:(要實作兩個整數的降序輸出)

【圖解】指針實作兩個整數降序輸出(企圖改變指針形參的值來改變指針實參的值)

原理看圖比較好了解

swap1函數的圖解:

【圖解】指針實作兩個整數降序輸出(企圖改變指針形參的值來改變指針實參的值)

交換的隻是swap1函數中的兩個形參的内容,而point_1、2和a、b的值都未變,就是實參和形參的問題

要想得到正确的結果,可以直接在swap1函數中輸出 *p1 和 *p2

swap2函數的圖解:

【圖解】指針實作兩個整數降序輸出(企圖改變指針形參的值來改變指針實參的值)

【總結】正式點來說就是:實參變量和形參變量之間的資料傳遞是單向的“值傳遞”方式。不可能通過執行調用函數來改變實參指針變量的值,但是可以改變實參指針變量所指變量的值

繼續閱讀