1. 程式人生 > >函式的值傳遞與地址傳遞--以輸入三個數並從小到大排列為例

函式的值傳遞與地址傳遞--以輸入三個數並從小到大排列為例

一、值傳遞

#include <stdio.h>

//自定義函式實現三個數從小到大排列
//值傳遞
//編者:wsg

void sort(int a, int b, int c)
{
	int t;
	
	if(a>b) 
	{
		t = a;
		a = b;
		b = t;
	}
	if(a>c)
	{
		t = a;
		a = c;
		c = t;
	}	
	if(b>c)
	{
		t = b;
		b = c;
		c = t;
	}
}

int main()
{
	int x, y, z;
	printf("請輸入三個數:\n");
	scanf("%d %d %d", &x, &y, &z);
	sort(x, y, z);
	
	printf("從小到大排列:%d %d %d\n", x, y, z);
	
	return 0;
}
我們來看一下結果:

可見並沒有實現排序,實際上是我們定義的sort()函式裡面並沒有發生值得交換。

該方法把引數的實際值複製給函式的形式引數。在這種情況下,修改函式內的形式引數不會影響實際引數。

但是,如果我們將printf("從小到大排列:%d %d %d\n", x, y, z);這一句放到sort()函式的末尾,程式碼如下:

#include <stdio.h>

//自定義函式實現三個數從小到大排列
//編者:wsg

void sort(int a, int b, int c)
{
	int t;
	
	if(a>b) 
	{
		t = a;
		a = b;
		b = t;
	}
	if(a>c)
	{
		t = a;
		a = c;
		c = t;
	}	
	if(b>c)
	{
		t = b;
		b = c;
		c = t;
	}
	printf("從小到大排列:%d %d %d\n", a, b, c);
}

int main()
{
	int x, y, z;
	printf("請輸入三個數:\n");
	scanf("%d %d %d", &x, &y, &z);
	sort(x, y, z);
	
	return 0;
}
我們再來看一下結果:

這時候實現了排序。我的理解是:

由於sort()函式我們定義的是void型,並沒有返回值,所以在主函式中呼叫是調不出結果來的,若把列印語句放到函式中去,是能執行到那一步的。

那麼,我們來看看地址傳遞的情況,程式碼如下:

#include <stdio.h>

//自定義函式實現三個數從小到大排列
//編者:wsg

void sort(int *a, int *b, int *c)
{
	int t;
	
	if(*a>*b) //條件判斷要解引用a和b的地址
	{
		t = *a;
		*a = *b;
		*b = t;
	}
	if(*a>*c)
	{
		t = *a;
		*a = *c;
		*c = t;
	}	
	if(*b>*c)
	{
		t = *b;
		*b = *c;
		*c = t;
	}
	//printf("從小到大排列:%d %d %d\n", *a, *b, *c);
}

int main()
{
	int x, y, z;
	printf("請輸入三個數:\n");
	scanf("%d %d %d", &x, &y, &z);
	sort(&x, &y, &z);
	
	printf("從小到大排列:%d %d %d\n", x, y, z);
	
	return 0;
}


再來看看結果:

與第一段程式碼相比較,這種採用地址傳遞的方式是能夠排列的。這是因為地址拿去交換了,而不是值。
通過指標傳遞方式,形參為指向實參地址的指標,當對形參的指向操作時,就相當於對實參本身進行的操作。