在函数中使用向量指针时出错

Posted

技术标签:

【中文标题】在函数中使用向量指针时出错【英文标题】:Error in using vector pointer in a function 【发布时间】:2010-03-01 12:03:30 【问题描述】:

我有这段代码,但它无法编译,我不明白哪里出了问题——我猜向量的指针不正确。 我的想法是在 main() 中收集一些数字并将它们存储在向量和数组中,然后将它们的内存地址传递给函数,并使用指针打印存储的数据。

当我读到一些关于指针的东西说我应该使用它们来节省内存时,我想到了这个,所以 IMO 下面的代码不会复制向量和数组的内容,而是使用指针来访问它们内存中的位置 - 这就是我想要做的。

#include <iostream>
#include <vector>
using namespace std;

void function(vector<int>* a, int *s)

    cout << "function starts.." << endl;
    for(int i=0;i<a->size();i++)
    
        cout << a[i] << endl;
        cout << s[a[i]] << endl;
    
    cout << "function ends..." << endl;



int main(void)

    vector<int> m;
    int s[102];
    for(int i=0;i<10;i++)
    
        m.push_back(i*i);
        s[i*i] = i-2;
    
    function(&m, &s);
    return 0;

我在编译时收到几个错误,有问题。

请告诉我我的代码有什么问题以及如何修复它。谢谢...

【问题讨论】:

猜测您得到的编译错误是否是您问题的一部分? ;-) 我已经教 C 和 C++ 编程多年,所以我很擅长猜测,因为通常的问题描述是“不起作用”。我从 eBay 买的水晶球也有帮助。 【参考方案1】:

你应该通过引用而不是指针来传递向量:

void function(vector<int>& a, int *s)

然后

function(m, ...);

在指向向量的指针上使用 [] 肯定会导致奇怪的问题,因为它的行为就像 a 指向一个 std::vectors 数组(虽然它实际上只指向一个)。向量本身永远不会被索引。您也可以使用(*a)[...] 通过指针来索引向量。

【讨论】:

确保在进行上述更改时进行如下调用:function(m, s); 拒绝投票,因为这是危险的建议——许多编码标准建议永远不要通过非常量引用,这是有充分理由的。至少,向量引用应该是 const。但是这个答案也没有解决真正的问题,即在使用指针之前需要取消引用它。将 a[i] 替换为 (*a)[i] 就足够了,并且可能对试图理解这个问题的读者更有帮助。【参考方案2】:

如果你坚持按指针解析,那么正确的语法应该是:

void function(vector<int>* a, int *s[]) 
 
    cout << "function starts.." << endl; 
    for(int i=0;i<a->size();i++) 
     
        cout << (*a)[i] << endl; 
        cout << (*s)[(*a)[i]] << endl; 
     
    cout << "function ends..." << endl; 
 

【讨论】:

错误:无法将 'int ()[102]' 转换为 'int*' 它不起作用。 很抱歉看到下面的 AndreyT 评论。但请调用 function(m,s) 并改为通过引用解析。【参考方案3】:

首先在主程序中 s 是一个指向 int 的指针,而 m 是一个向量。因此函数调用应该如下:

函数(&m, s);

其次在函数a中是一个指向向量的指针,所以应该按如下方式索引:(*a)[i]。

但是,您确实应该使用 const 引用来传递您的向量:

void 函数(const vector& a, int *s) .. cout

然后这样称呼它:

函数(m, s);

【讨论】:

【参考方案4】:

(已修正)

&amp;s 实际上是int(*)[102]:指向一个包含 102 个项目的数组的指针。

你应该说

function(&m, s);

这是因为根据旧的 C 遗留规则,数组本质上是一个指向其索引为 0 的项的 const 指针。所以s 已经是int*

【讨论】:

&amp;s不是 int **&amp;sint (*)[102]。数组不是 const 指针。在值上下文中,它可能会出现,但在这种情况下,当使用地址时不会出现。 是的,确实如此。无论如何,&amp;s 不是int*,将s 作为参数传递就足够了。【参考方案5】:

此版本有效:

#include <iostream>
#include <vector>
using namespace std;

void function(const vector<int>& a, int s [102])

    cout << "function starts.." << endl;
    for(int i=0;i<(int)a.size();i++)
    
        cout << a [i] << endl;
        cout << s[a [i]] << endl;
    
    cout << "function ends..." << endl;



int main(void)

    vector<int> m;
    int s[102];
    for(int i=0;i<10;i++)
    
        m.push_back(i*i);
        s[i*i] = i-2;
    
    function(m, s);
    return 0;

【讨论】:

很好,它有效。但是我可以看到 s 没有作为指针传递 - 为什么?我还想在函数中传递一个指向 s 的指针,所以我不会将整个数组传递给函数 - 有什么办法吗? 按值传递整个数组不是好的做法。我会使用“void function(const vector& a, int *s)”并将其称为“function(m, s);” @VaiolsBorn:它作为指针传递——你不能在 C++ 中按值传递数组。参数中的int s[102] 完全等同于int s[](无论如何忽略大小)和int* s(无论如何数组衰减为指针)。 这里是: void function(const vector& a, int *s) cout

以上是关于在函数中使用向量指针时出错的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 向量中存储指针时出错

使用 unordered_map 值初始化指向向量的指针时出错

使用条件 while/for 循环的指针在编译时会出错

C++11 线程:将向量传递给线程函数时出错

Windows 中的多线程 - 创建函数指针数组时出错

在 C++ 的构造函数中分配对象向量时出错