[英]Vector as an argument (int**) to function
如果我將函數聲明為,例如:
void f1(int* a);
和簡單的向量: std::vector<int> v
- 我可以使用此向量作為此函數的輸入:
f1(&v[0]);
但是,如果我有函數f2
,例如:
void f2(int** a);
和另一個向量: std::vector<int> *v
。 如何將它與矢量數據一起使用?
目前我有一個動態分配的表,它使用函數f2
( f2(&tab,tablength)
)。 它工作正常,但我還要發送tablength
。 因為我現在正在改變程序的邏輯,我想我可以使用向量而不是經典表(因為我需要一個可以改變大小的數組)。 但我堆積了。 簡而言之, f2
是一個函數,它通過GF(2^8)
某個常量值實現乘法表tab
。
向量和指針指針是不同的東西。 您必須實現邏輯以從一個轉換為另一個。
在將此數組作為參數傳遞給f2
之前,您必須分配一個動態數組並將數據從向量復制到該數組。 您還必須添加另一個參數來傳遞數組的大小。
你可以這樣做:
int *p = &(*v)[0];
f2(&p);
然而,這可能不是你想要做的。 不幸的是,如果不理解f2
實際上如何使用int **a
參數,很難說什么是正確的事情 - 也許實現第二個f2(std::vector<int>& av)
函數?
編輯:看到編輯過的問題,我建議您使用f2(std::vector<int>& av)
,並擺脫f2(int **)
變體。
void f1(int* a);
是一個需要存儲int
的內存地址的函數,在這種情況下(基於用法: f1(&v[0]);
)它是數組的第一個元素,這個函數將修改它的元素。
另一方面, void f2(int** a);
期望指向第一個元素的指針,這意味着該函數很可能會嘗試更改指針本身。 對於數組,此類函數很可能會重新分配數組(更改其大小)或完全取消分配它。 在這種情況下,嘗試做類似int *p = &v[0]; f2(&p);
事情int *p = &v[0]; f2(&p);
int *p = &v[0]; f2(&p);
將產生未定義的行為 。
清晰且語義正確的解決方案是改變f2
函數以引用向量而不是: void f2(std::vector<int>& v)
。 通過引用傳遞矢量對象將允許此函數相對於傳遞給它的對象的生命周期更改其元素以及矢量本身。 (其中一個最大的后果就是完全消除了丑陋的內存管理,否則就是必要的。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.