2

如果我将函数声明为,例如:

void f1(int* a);

和简单的向量:std::vector<int> v- 我可以使用这个向量作为这个函数的输入:

f1(&v[0]);

但是,如果我有功能f2,例如:

void f2(int** a);

和另一个向量:std::vector<int> *v. 如何将它与矢量数据一起使用?

目前我有一个动态分配的表,它使用函数f2f2(&tab,tablength))。它工作正常,但我必须另外发送tablength. 因为我现在正在稍微改变程序的逻辑,所以我认为我可以使用向量而不是经典表格(因为我需要一个可以改变大小的数组)。但是我叠了。简而言之,f2是一个实现表tab乘以GF(2^8).

4

3 回答 3

4

向量和指向指针的指针是不同的东西。您将必须实现从一种转换到另一种的逻辑。

在将此数组作为参数传递给f2. 您还必须添加另一个参数来传递数组的大小。

于 2013-09-02T15:11:37.267 回答
3

你可以这样做:

int *p = &(*v)[0]; 

f2(&p); 

但是,这可能不是您想要做的。不幸的是,如果不了解f2实际如何使用该int **a参数,就很难说正确的做法是什么——也许实现第二个f2(std::vector<int>& av)功能?

编辑:看到已编辑的问题,我建议您使用f2(std::vector<int>& av), 并摆脱f2(int **)变体。

于 2013-09-02T15:20:36.110 回答
1

void f1(int* a);是一个函数,它需要一个内存地址,其中int存储了 an ,在这种情况下(基于用法:)f1(&v[0]);它是数组的第一个元素,该函数将修改其中的元素。

另一方面,void f2(int** a);期望一个指向第一个元素的指针,这意味着该函数很可能会尝试更改指针本身。在数组的情况下,这种函数很可能会重新分配数组(更改其大小)或完全释放它。在这种情况下,尝试做类似的事情int *p = &v[0]; f2(&p);会产生未定义的行为

干净且语义正确的解决方案将更改f2函数以改为引用向量:void f2(std::vector<int>& v). 通过引用传递向量对象将允许此函数更改其元素,但也允许向量本身相对于传递给它的对象的生命周期。(这样做的最大后果之一将是完全消除丑陋的内存管理,否则这将是必要的。)

于 2013-09-02T15:25:35.227 回答