例如,我想声明指向数组的指针而不想初始化它。然后,我想把它传递给一个函数并在函数中初始化它。我如何在c++中做到这一点?
void F(int *B, const int& N) {
B = new int[N];
for (int i = 0; i < N; ++i) B[i] = i;
}
int main() {
int N = 4;
int *B = nullptr; // doesn't work
F(*B, N);
for (int i = 0; i < N; ++i)
cout << B[i] << endl;
return 0;
}
它引起/产生错误对应的问题是B没有对point和的引用,因此他不能初始化数组。
错误:Process finished with exit code 11
传递的指针是原始指针的副本。当修改F
中的B
时,B
imain()
保持不变。
您需要通过引用传递指针或将指针传递给指针:
void F(int*& B, const int& N) {
B = new int[N];
for (int i = 0; i < N; ++i) B[i] = i;
}
int main() {
int N = 4;
int *B = nullptr; // doesn't work
F(B, N); //no operator here, just pass the pointer by reference
for (int i = 0; i < N; ++i)
cout << B[i] << endl;
return 0;
}
或
void F(int** B, const int& N) {
*B = new int[N];
for (int i = 0; i < N; ++i) (*B)[i] = i;
}
int main() {
int N = 4;
int *B = nullptr; // doesn't work
F(&B, N); //need address-of operator
for (int i = 0; i < N; ++i)
cout << B[i] << endl;
return 0;
}
另外,由于您决定使用手动内存管理,您还负责释放通过new
获得的内存。如果您使用std::vector
作为容器而不是原始指针(或std::unique_ptr
或其他容器),则不需要这样做。
for (int i = 0; i < N; ++i)
cout << B[i] << endl;
delete[] B; //release memory after use
return 0;
你至少有两个问题
使用*B
的调用中的第一个in。*B
与B[0]
相同,这意味着您试图将单个int
元素传递给函数。但是由于B
是空指针,解引用将导致未定义行为。
正确的(为了符合所示的函数签名)应该是普通的B
:
F(B, N);
第二个问题是,默认情况下,将参数传递给函数是通过值完成的。这意味着B
的值被复制到F
函数内部的局部变量B
中。
当你在函数中赋值给B
时,你只改变了本地副本,main
函数中的原始值不会被修改。
B
。void F(int*& B, const int N) { ... }