1. 程式人生 > >C語言中如何用指標交換兩個數的大小

C語言中如何用指標交換兩個數的大小

如何用傳址的方式交換兩個數的大小

首先先看第一個程式,用函式的呼叫來解決看似正確實則執行出來的結果是錯誤的

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int JH(int x, int y);
int main()
{
	int a, b;
	printf("請輸入兩個數:\n");
	scanf("%d%d", &a,&b);
	JH(a, b);
	printf("交換後兩數的值分別為%d和%d", a,b);
	system("pause");
	return 0;
}
int JH(int x, int y)
{
	int temp;
	if (x != y)
	{
		temp = x;
		x = y;
		y= temp;
	}
	return 0;
}

首先我們先來分析一下這個程式,他只該表了x和y的值並未改變a和b的值,由於單向的值傳遞方式,形參的改變不能使實參發生改變,所喲最後輸出的結果仍然和輸入的值一樣並未改變a和b的值。因此行參只是實參的一個拷貝,形參改變了只是拷貝改變了,實參仍為原來的值,但是你如果用傳址呼叫的話,把形參定義為指標變數,實參呼叫地址的話,單你把指標所指的變數改變,實參所對應的值也改變了。所以下面我們來修改這個程式
<pre name="code" class="csharp">#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int JH(int *x, int *y);
int main()
{
	int a,b,*p1,*p2;
	printf("請輸入兩個數:\n");
	scanf("%d%d", &a,&b);
	p1 = &a;
	p2 = &b;
	JH(p1,p2);
	printf("交換後兩數的值分別為%d和%d", *p1,*p2);
	system("pause");
	return 0;
}
int JH(int *x, int *y)
{
	int p;
	if (*x != *y)
	{
		p = *x;
		*x = *y;
		*y = p;
	}

	return 0;
}


改進後的程式執行出來是沒有問題的