C++ 可以将空指针传递给函数吗?
Can C++ pass empty pointer to a function?
例如,我想声明指向数组的指针并且不想初始化它。然后,我想将它传递给一个函数并在函数中完全初始化它。我怎样才能在 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;
}
evokes/produces错误对应的问题是B没有指向point的引用,因此无法初始化数组。
错误:进程已完成,退出代码为 11
您传递的指针是原始指针的副本。当你在F
中修改B
时,B
i main()
保持不变。
您需要通过引用传递指针或将指针传递给指针:
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
。 *B
与 B[0]
相同,这意味着您正试图将单个 int
元素传递给函数。但是由于 B
是一个空指针,取消引用将导致 未定义的行为。
正确(以适应显示的函数签名)将是简单的 B
:
F(B, N);
第二个问题是默认情况下向函数传递参数是按值完成的。这意味着 B
的值被复制到函数 F
.
内部的局部变量 B
中
当你在函数中赋值给B
时,你只改变了本地副本,main
函数中的原始值将保持不变。
要解决此问题,您需要通过 reference:
传递 B
void F(int*& B, const int N) { ... }
例如,我想声明指向数组的指针并且不想初始化它。然后,我想将它传递给一个函数并在函数中完全初始化它。我怎样才能在 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;
}
evokes/produces错误对应的问题是B没有指向point的引用,因此无法初始化数组。
错误:进程已完成,退出代码为 11
您传递的指针是原始指针的副本。当你在F
中修改B
时,B
i main()
保持不变。
您需要通过引用传递指针或将指针传递给指针:
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
。 *B
与 B[0]
相同,这意味着您正试图将单个 int
元素传递给函数。但是由于 B
是一个空指针,取消引用将导致 未定义的行为。
正确(以适应显示的函数签名)将是简单的 B
:
F(B, N);
第二个问题是默认情况下向函数传递参数是按值完成的。这意味着 B
的值被复制到函数 F
.
B
中
当你在函数中赋值给B
时,你只改变了本地副本,main
函数中的原始值将保持不变。
要解决此问题,您需要通过 reference:
传递B
void F(int*& B, const int N) { ... }