在函數執行到return語句時,將不再向下執行,那么如何讓函數一次性返回多個值?一般可以用兩種方式解決這個問題,利用指針和利用結構體。
一. 利用指針
直接上代碼
#include <iostream> using namespace std; int main() { int* test(int,int,int); int * result =test(1,2,3); cout<<result[0]<<endl<<result[1]<<endl<<result[2]<<endl; getchar(); return 0; } int * test(int a,int b,int c) { int* presult =new int[3]; presult[0] =a; presult[1] =b; presult[2] = c; return presult; }
運行結果:
1
2
3
可以看到,我們其實定義了一個int類型的指針作為函數test的類型,所以這個函數的返回值也應該是一個int類型的指針,所以在第15行,我們定義了一個presult指針,並讓它指向一個三個元素的數組。(在這里,其實我們並沒有定義數組,而是使用了動態內存分配的方式)然后將三個形參分別寫入到數組里,最后將指針作為函數的返回值返回。顯然這個函數的功能是沒有意義的,在這里只做演示而已。
利用指針作為函數的返回值的方式有一個很大的弊端,不管返回幾個值,他們的類型都是相同的。所以為了避免這個問題,我還需要另一種方式,利用結構體。
二. 利用結構體
還是先上代碼:
#include <iostream> using namespace std; struct result { int first; double second; }; int main() { result test(int a,double b); result returnvalue =test(1,2.1234); cout<<returnvalue.first <<endl<<returnvalue.second<<endl; getchar(); return 0; } result test(int a,double b) { struct result ret; ret.first = a; ret.second = b; return ret; }
運行結果:
1
2.1234
結構體是C語言中的一種允許用戶自定義的數據結構,其關鍵詞為struct 。首先,我們定義了一個結構體類型叫result,它里面包含兩個成員分別為int類型的first與double類型的second。
我們可以這樣理解結構體類型,定義之后,result與int,double,float等C語言自帶的數據類型沒有區別,只不過這個result使我們自己定義的而已,更多關於結構體的內容可以參考:
http://blog.csdn.net/chaipp0607/article/category/6627824
然后,我們定義的函數test其實就是一個result類型的函數,定義的變量ret和returnvalue 也是result類型的變量,test的返回值當然也是一個result類型的值。我們利用result類型的變量–returnvalue 中的成員,區分開int和double,實現返回值的類型不同。
最后,雖然語法上允許這樣做, 但是考慮到返回值拷貝的關系,最好:
①對於大小為1字節、2字節或4字節的struct,可以通過函數來返回。
②對於大小不是1字節、2字節或4字節的struct,不要通過函數來返回。
參考鏈接:
3. StackOverFlow: Is it safe to return a struct in C or C++?