C++: 利用指針和結構體實現一個函數返回多個值


在函數執行到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,不要通過函數來返回。

參考鏈接:

1. C++ 利用指針和結構體實現一個函數返回多個值

2. 【C++】臨時變量不能作為函數的返回值?

3. StackOverFlow: Is it safe to return a struct in C or C++?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM