【问题标题】:Is it passing by pointer?它是通过指针传递的吗?
【发布时间】:2012-01-16 04:08:26
【问题描述】:
void func(char* buf) { buf++;}

我应该称之为通过指针传递还是只通过值传递(值是指针类型)?这种情况下传入的原始指针会被改变吗?

【问题讨论】:

    标签: c++ pass-by-reference pass-by-value


    【解决方案1】:

    这是按值传递。

    void func( char * b )
    {
        b = new char[4];
    }
    
    int main()
    {
        char* buf = 0;
        func( buf );
        delete buf;
        return 0;
    }
    

    在调用func 后,buf 仍为 0,新的内存将泄漏。

    当您通过值传递指针时,您可以更改指针指向的内容而不是指针本身。

    做上述事情的正确方法是

    备选方案 1

    void func( char *& b )
    {
        b = new char[4];
    }
    
    int main()
    {
        char* buf = 0;
        func( buf );
        delete buf;
        return 0;
    }
    

    注意指针是通过引用而不是值传递的。

    替代方案 2

    另一种选择是将指针传递给像

    这样的指针
    void func( char ** b )
    {
        *b = new char[4];
    }
    
    int main()
    {
        char* buf = 0;
        func( &buf );
        delete buf;
        return 0;
    }
    

    请注意,我绝不提倡像上面那样使用裸指针和手动内存管理,而只是说明传递指针。 C++ 方法是使用 std::stringstd::vector<char> 代替。

    【讨论】:

    • 大声笑,你的内存会被泄露:)
    • 直接调用new而不调用delete。与通过指针或值传递无关。
    • @MichaelDorgan 在他的情况下如何避免这种情况?换句话说,如何为 b 分配一个新值而不是使用 new?
    • 很抱歉分散了大家的注意力。试图搞笑,但没有成功。
    • 你知道,我以前从未真正见过指向引用的指针。我一直用双指针的方法来明确表示传入的值被修改了。
    【解决方案2】:

    要通过“传递指针”实现引用语义,必须发生两件事:调用者必须获取要传递的事物的“地址”,而被调用者必须取消引用指针。

    这部分可以通过使用数组来掩盖,数组衰减到指向第一个元素的指针 - 从这个意义上说,数组内容总是“通过引用传递”。不过,您可以使用“一个数组”来隐藏取消引用。

    这是直截了当的方法:

    void increment_me(int * n) { ++*n; }    // note the dereference
    
    int main() { int n; increment_me(&n); } // note the address-of
    

    这也是变相的:

    void increment_me(int n[]) { ++n[0]; }     // no visible *  
    int main() { int n[1]; increment_me(n); }  // or &
    

    【讨论】:

      【解决方案3】:

      指针本身是按值传递的(指向的内存是按指针传递的)。改变函数内部的参数不会影响传入的指针。

      【讨论】:

        【解决方案4】:

        指针不会改变。通过指针传递意味着传递一个地址。如果你想改变指针,你必须将一个双指针传递给它一次。

        
        foo( char **b)
        {
          *b = NULL;
        }
        

        【讨论】:

          猜你喜欢
          • 2015-03-28
          • 1970-01-01
          • 2014-07-26
          • 1970-01-01
          • 1970-01-01
          • 2020-05-14
          • 2014-07-27
          • 2023-03-03
          相关资源
          最近更新 更多