有時咱們須要用一個函數改變另外一個函數中的變量。例如,排序問題的一個常見任務是交換兩個變量的數值。假設要交換兩個變量x和y的數值:
x=y;
y=x;
上面這段簡單的代碼並不能實現這個功能,由於當執行第二行時,x的原數值已經被y的原數值所代替。這就須要另一行語句對x的原數值進行存儲。
temp=x;
x=y;
y=temp;
如今這段代碼就能夠實現數值交換的功能,能夠將其編寫成一個函數並構造一個驅動程序進行測試。在程序清單9.13中,爲了清楚的代表某變量屬於函數main()仍是屬於函數interchange(),前者使用了變量x和y,後者使用的是u和v。
程序清單 9.13 swap1.c程序
/*swap1.c 交換函數的第一個版本*/
函數
#include <stdio.h> void interchange(int u,int v); /*聲明函數*/ int main(void) { int x=5,y=10; printf("Originally x = %d and y = %d.\n",x,y); interchange(x,y); printf("Now x = %d and y = %d.\n",x,y); return 0; } void interchange(int u,int v) { int temp; temp = u; u = v; v = temp; }
程序的運行結果以下:
Originally x = 5 and y = 10.
Now x = 5 and y = 10 .
使人吃驚的是數值並無發生交換。下面咱們在interchange()中加入一些打印語句來檢查錯誤。
程序清單 9.14 swap2.c程序
/*swap2.c --分析swap1.c程序*/
測試
#include <stdio.h> void interchange(int u,int v); int main(void) { int x = 5,y = 10; printf("Originally x = %d and y = %d.\n",x,y); interchange(x,y); printf("Now x = %d and y = %d.\n",x,y); return 0; } void interchange(int u,int v) { int temp; printf("Originally u = %d and v = %d.\n",u,v); temp = u; u = v; v = temp; printf("Now u = %d and v = %d.\n",u,v); }
新的輸入結果是:
Originally x = 5 and y = 10.
Originally u = 5 and v = 10.
Now u = 10 and v = 5.
Now x = 5 and y = 10.
函數interchange()並無出錯,u和v的數值確實發生了交換。問題在於把執行結果傳遞給main()的時候。正如已經指出的那樣,interchange()使用的變量獨立於函數main(),所以交換u和v的數值對x 和y 的數值沒有任何影響!使用return()語句能夠嗎?能夠在interchange()的結尾處加入下面的一行語句:
return (u);
而後改變main()中對該函數的調用方式:
x = interchange(x,y);
作了上述更改之後,x被賦予了新值,而y的數值並無改變。由於return語句只能把一個數值傳遞給調用函數,但如今咱們須要傳遞兩個數值,這並不是不能實現!只須要使用指針就能夠了。指針