簡體   English   中英

如何通過引用C ++中的函數來傳遞數組?

[英]How can I pass an array by reference to a function in C++?

我有以下程序,其中兩個變量將通過引用傳遞給函數,在返回到main()之前,將根據外部因素確定其值,以便其他函數可以使用它們。 我嘗試傳遞的第一個變量是int ,它可以正常運行,但是另一個是字符串數組,這給我帶來了一些問題。

我對此進行了足夠的研究,以知道您無法使用數組或引用(盡管我還沒有弄清楚原因),而且我想知道是否有人可以幫助我弄清楚如何做到這一點? 我嘗試過的各種方法都導致了segmentation faults

注意 :下面的代碼使數組按值傳遞,因為我只是不知道該為它寫什么。

更新 :我的課程需要使用數組。 某些其他數據結構(例如建議的vector會很棒,但是我必須使用特定的結構。

void initialise_existing_devices(int& no_of_existing_devices, string existing_devices[100]);

int main()
{
    int no_of_existing_devices = 0;
    string existing_devices[100];

    initialise_existing_devices(no_of_existing_devices, existing_devices[100]);
}

void initialise_existing_devices(int& no_of_existing_devices, string existing_devices[100])
{
    string line;
    ifstream DeviceList;
    DeviceList.open("devices/device_list");
    while (true)
    {
        getline(DeviceList, line, '\n');
        if (DeviceList.eof())
        {
            break;
        }
        ++ no_of_existing_devices;
    }
    DeviceList.close();

    DeviceList.open("devices/device_list");
    for (int i = 0; i < no_of_existing_devices; i ++)
    {
        getline(DeviceList, line, '\n');
        existing_devices[i] = line;
    }
}

對數組的引用如下所示:

void f(std::string (&a)[N]) { }

其中a是參數的名稱, N是數組中元素的數量。


但是, 通常在C ++中,您不通過引用傳遞數組(可以;這並不常見)。 其他選項包括:

  • 將指針傳遞給數組的初始元素; 在這種情況下,請考慮將數組的大小作為第二個參數傳遞給函數。

  • 改用std::vector<std::string>std::array<std::string, N>並通過引用傳遞它(您也可以在Boost中找到array psuedo-container;禁止這樣做,考慮編寫如果您看一下Boost源代碼,它非常簡單明了。

  • 將一對迭代器(開始和結束)傳遞給函數,並使用它們來操縱范圍。

最后一個選擇是最慣用的C ++方法。 它也是最通用的,因為您可以使用任何類型的容器,包括數組,標准庫容器或您自己編寫的容器。


由於您實際上是在嘗試將參數用作“輸出”參數,因此最好返回一個包含結果的std::vector<string>std::array<string, 100> 這要干凈得多。

該行未達到您的期望:

initialise_existing_devices(no_of_existing_devices, existing_devices[100])

提示:數組索引,100 ...

我建議您使用std::vector<std::string>而不是數組,並通過引用傳遞它。

編輯:好的,給定更新:

你可以使用struct嗎? 如果是這樣,您可以將數組包裝在struct

struct string_array
{
  string data[100];
};

然后在main中定義一個實例,並通過引用傳遞它? 我確定您可以填寫詳細信息.. :)

您應該將std::vector<T>用於堆管理的數組,或者將boost:: / std::array<T, N>用於基於堆棧的數組。 這些對象將保持自己的大小。

對於實際參數,僅使用表示數組地址的數組名稱:

initialise_existing_devices(no_of_existing_devices, existing_devices);

對於參數,使用它作為指向數組的常量指針:

void initialise_existing_devices(int& no_of_existing_devices, string existing_devices[])

也就是說,使用std :: vector作為返回類型或引用參數將避免在調用之前猜測設備的數量。

這是C ++與C的共同點之一。數組不按值傳遞。 他們被降級為指向第一個元素的指針。 函數參數中的數組語法本質上只是一個注釋。 您可以通過在函數調用中執行一個sizeof(existing_devices)來判斷。 因此,您的問題的答案是您已經在這樣做了。

您可以使用模板,如下所示:

template <size_t size> 
initialise_existing_devices(int& no_of_existing_devices, string (&existing_devices)[size])
{
}

或者您可以執行以下操作:

typedef string hundred_strings[100];

initialise_existing_devices(int& no_of_existing_devices, hundred_strings &existing_devices)
{
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM