为什么我不能通过将指针传递给函数来初始化数组?

Eri*_*rix 4 c++ pointers

我知道这有一个非常简单的解释,但是我已经被一段时间不必使用指针所困扰了.

为什么我不能在c ++中做这样的事情

int* b;
foo(b);
Run Code Online (Sandbox Code Playgroud)

并通过...初始化数组

void Something::foo(int* a)
{
  a = new int[4];
}
Run Code Online (Sandbox Code Playgroud)

在调用foo(b)之后,b仍为null.为什么是这样?

Kon*_*lph 13

指针按值传递给函数.从本质上讲,这意味着复制指针值(但不是指针!).您修改的只是原始指针的副本.

有两种解决方案,都使用额外的间接层:

  1. 要么使用参考:

    void f(int*& a) {
        a = new int[4];
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或者你传入一个指向指针的指针(在你的情况下不像传统参数那样常规):

    void f(int** pa) {
       *pa = new int[4];
    }
    
    Run Code Online (Sandbox Code Playgroud)

    并调用这样的函数:

    f(&a);
    
    Run Code Online (Sandbox Code Playgroud)

就个人而言,我不喜欢这两种风格:参数是函数输入,输出应该由返回值处理.到目前为止,我还没有看到在C++中偏离此规则的令人信服的理由.所以,我的建议是:改用以下代码.

int* create_array() {
    return new int[4];
}
Run Code Online (Sandbox Code Playgroud)

  • @Martin:`NULL`检查完全没有用,因为你在C++中真正需要的是一个指针有效性检查 - 它不存在.所以不,代码虽然很脆弱,但是调用者有责任确保指针正确,我同意这不是你想写的代码.*但是*,实际上有些人看到了这种风格的好处,因为它在调用者的网站*上明显*该函数修改了参数的值.参考文献并不明显.就个人而言,我不同意 - 但是,我从来没有使用过`out`参数. (3认同)

Tad*_*pec 6

您可以通过值将参数传递给foo.改成

foo(int*& a)
Run Code Online (Sandbox Code Playgroud)