我正在玩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;
}
答案 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
,并且它的存在是自动管理的(不需要删除))。