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

时间:2010-03-01 12:03:30

标签: c++ arrays pointers vector

我有这个代码,但它不会编译,我无法理解有什么问题 - 我猜测向量的指针是不正确的。 我的想法是在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;
}

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

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

5 个答案:

答案 0 :(得分:5)

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

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

然后

function(m, ...);

在指向向量的指针上使用[]肯定会引起奇怪的问题,因为它的行为就好像指向std :: vectors数组(虽然它实际上只指向一个)。向量本身从未被索引编入索引。您还可以使用(*a)[...]通过指针索引向量。

答案 1 :(得分: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; 
} 

答案 2 :(得分:1)

(校正)

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

你应该说

function(&m, s);

这是因为通过旧的C遗留规则,数组本质上是指向其索引为0的项的const指针。因此s已经int*

答案 3 :(得分:1)

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

功能(&amp; m,s);

其次在函数中a是指向向量的指针,因此应该按如下方式编入索引:(* a)[i]。

但是你应该使用const引用来传递你的向量:

void函数(const向量&amp; a,int * s) { .. cout&lt;&lt; a [i]&lt;&lt; ENDL; .. }

并称之为:

功能(m,s);

答案 4 :(得分:0)

此版本有效:

#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;
}