函數實現兩個數交換(通過指標間接存取函數外部的變數)

2020-10-27 12:01:04

函數實現兩個數交換

首先,我們來看看不使用函數,怎麼實現兩個數位的交換呢?

#include <stdio.h>
int main()
{
	int a = 50;
	int b = 100;
	int temp = a;
	a = b;
	b = temp;
	printf("a=%d b=%d\n", a, b);
	system("pause");
	return 0;
}

結果:a和b成功的實現了交換。
在這裡插入圖片描述


那麼使用函數如何實現呢?
很多人會覺得,只需要將上面交換數位的部分放到函數中就可以了,那我們來試試:

#include <stdio.h>
void swap(int x, int y){
	int temp = x;
	x = y;
	y = temp;
}
int main()
{
	int a = 50; 
	int b = 100;
	swap(a, b);
	printf("a=%d b=%d\n", a, b);
	system("pause");
	return 0;
}

結果:

分析:我們可以看到,在這個程式碼中, a和b沒有發生交換。
那麼x,y發生交換了嗎?
我們可以在函數中加入輸出x,y值的程式碼看一下。

程式碼:

void swap(int x, int y){
	int temp = x;
	x = y;
	y = temp;
	printf("x=%d y=%d\n", x, y);
}

結果:
在這裡插入圖片描述
分析:在這個程式碼中我們發現,a和b沒有發生交換。函數內部交換的是 x 和 y,x 和 y 相當於建立出的新的區域性變數,只是通過a,b初始化了。交換 x 和 y 不會影響到 a 和 b。

原因是: 函數內部存取的x和y不是a和b的本體


  要想解決這個問題,就需要想辦法讓函數內部能夠存取到函數外面的變數。在C語言中,我們不能直接存取函數外部的區域性變數,但是 可以使用指標來間接存取外部的變數

程式碼實現:

void swap(int* x, int* y){
	int temp = *x;
	*x = *y;
	*y = temp;
}

此處的 swap 函數等價於以下程式碼:

    int* x = &a;
	int* y = &b;
	
	int temp = *x;
	*x = *y;
	*y = temp;

	int temp = a;
	a = b;
	b = temp;

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

在這個程式碼中, 先定義兩個指標變數x,y,其中x儲存a的地址,y儲存b的地址。代表對指標的解除參照,表示指標指向的目標。 所以x 就等價於 a,*y等價於,然後通過臨時變數temp交換a,b。


最終的程式碼實現:

#include <stdio.h>
void swap(int* x, int* y){
	int temp = *x;
	*x = *y;
	*y = temp;
}

int main()
{
	int a = 50;
	int b = 100;
	swap(&a, &b);
	printf("a=%d b=%d\n", a, b);
	system("pause");
	return 0;
}