使用*和&一起在功能签名

时间:2018-03-23 09:17:07

标签: c++ pointers

我正在玩c ++并尝试理解向量及其签名。 在下面的方法printPrimes中我需要使用带有地址的指针?

vector<int> &primes是不够的,因为主方法printPrimes已经在发送地址。

void printPrimes(long long l, long long r, vector<int>* &primes) {
 // some code
}
vector<int>* sieve() {

 vector<int> *prime = new vector<int>();
 return prime;

}
int main() {
    vector<int> *primes = sieve();
    printPrimes(l, r, primes);  
    return 0;
}

3 个答案:

答案 0 :(得分:4)

  

我需要使用地址为

的指针

此处,&并不代表&#34;地址&#34 ;;它表示类型&#34;引用&#34;。

如果你写的不是这样的话,它会更清楚:

vector<int>* &primes

但是像这样:

vector<int>*& primes

虽然空白的选择是人为的,但更好的文档表明这个&是&#34;类型的一部分&#34;。

有一些类型:

  • std::vector<T> = T s
  • 的向量
  • std::vector<T>& =对T s
  • 的向量的引用
  • std::vector<T>* =指向T s
  • 的向量的指针
  • std::vector<T>*& =对T s
  • 向量的指针的引用
  • std::vector<T>*** =指向指向T s
  • 向量的指针的指针
  • std::vector<T>**& =对指向T s
  • 向量的指针的指针的引用

......等等。

至于为什么你需要一个vector<int>*&printPrimes来完成它的工作,我们无法告诉你实际上没有能够看到它。我会说它似乎不太可能需要一个指针,并且如果它想修改那个指针它会导致new和{{1}的问题在调用范围内。

事实上,所有动态分配都是毫无意义的,只会使事情复杂化。

以下内容可能改为:

delete

答案 1 :(得分:1)

在函数参数的c ++ &中用于通过引用传递参数。 vector<int>* &primes声明primes是对vector<int>指针的引用。

如果printPrimes表示只打印传递给函数的向量,则表示签名

void printPrimes(long long l, long long r, vector<int> &primes);

也可以完成这项工作。

当需要修改传递给函数的指针并且预期在调用函数中看到它的效果时,需要引用指针。

void foo(int*& p){
    p = new int[10]; 
    // rest of the code 
}

如果函数bar正在调用foo

void bar(/* some parameters */){
    // ...
    int *p;
    foo(p);
    // rest of the code
}  

foo正在修改指针本身,此修改也将被视为bar,并且可以从p访问分配给bar的内存。

答案 2 :(得分:1)

必须以这种方式读取

vector<int>* &primes参数:

引用int

的向量指针

而不是

int 向量指针的地址(你是对的,没用)

通过引用传递允许直接操作范围之外的任何实例(比如指针,但是更安全的方式,因为引用不能是nullptr,并且它的存在是自动管理的(不需要删除))。