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*BB[0] 相同,这意味着您正试图将单个 int 元素传递给函数。但是由于 B 是一个空指针,取消引用将导致 未定义的行为

正确(以适应显示的函数签名)将是简单的 B:

F(B, N);

第二个问题是默认情况下向函数传递参数是按值完成的。这意味着 B 的值被复制到函数 F.

内部的局部变量 B

当你在函数中赋值给B时,你只改变了本地副本,main函数中的原始值将保持不变。

要解决此问题,您需要通过 reference:

传递 B
void F(int*& B, const int N) { ... }