首先,我們來看看不使用函數,怎麼實現兩個數位的交換呢?
#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;
}