[英]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.