c++ - 您在 c/c++ 项目中使用指针到指针和/或指针引用最有用的时间是什么时候?

标签 c++ c pointers reference

Pointers-to-pointers 和 references-to-pointers 乍一看似乎过于复杂,尤其是对于新手而言。您在从事的 c/c++ 项目中使用它的最佳和最有用的原因是什么?

这可以帮助人们更好地理解指针以及如何有效地使用它们。

已编辑:包括 C 和 C++

最佳答案

指向指针的指针非常常用作分配和返回缓冲区的参数,例如字符串:

void SetValue(char** buf)
{
    string s = "Hello, Ptr Ref";
    *buf = new char[s.length()+1];
    copy(s.begin(), s.end(), *buf);
    (*buf)[s.length()] = 0;
}


int main()
{
    char* buf = 0;
    SetValue(&buf);
    cout << buf;
    delete [] buf;
    return 0;
}

类似地,您可以传递对该缓冲区的引用,而不是传递指向您要分配和修改的缓冲区的指针。这有助于向调用者阐明函数的语义,这样他们就不会执行诸如调用 SetValue(0);

之类的操作
void SetValue(char*& buf)
{
    string s = "Hello, Ptr Ref";
    buf = new char[s.length()+1];
    copy(s.begin(), s.end(), buf);
    buf[s.length()] = 0;
}


int main()
{
    char* buf = 0;
    SetValue(buf);
    cout << buf;
    delete [] buf;
    return 0;
}

但即使 SetValue(char*&) 的语义可能比 SetValue(char**) 版本更清晰一些,仍有改进的空间.谁拥有结果指针的问题浮现在脑海中。

请记住,虽然这些示例过于简单和做作,但类似的实现比比皆是。在许多这样的情况下,您别无选择——例如,在调用 WINAPI 函数时,如 FormatMessage()并要求它分配缓冲区。但是在您编写函数的许多其他情况下,会有其他方法给猫蒙皮。可以说,更好的方法。如:

string GimmeValue()
{
  return "Hello, String";
}

出于各种原因,这可能会更好。按值返回值在语义上(可能)比使用指向指针的指针更清晰,因为所有权问题很容易解决。通常最好避免在堆栈分配的变量可以正常工作的地方使用 operator new,因为您可以避免由于 delete 多次缓冲区而导致的潜在内存泄漏或缺陷。

关于c++ - 您在 c/c++ 项目中使用指针到指针和/或指针引用最有用的时间是什么时候?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2096668/

相关文章:

python - 寻找 Psyco 的良好替代品(Python->C 编译器)

C - 访问参数 vector 创建指针和读取值

c - 取消引用指向不完整类型结构的指针

c++ - fputc 性能和优化

c++ - std::bind 和 winsock.h 绑定(bind)混淆

c++ - GCC 的函数 __attribute__ 是否与虚函数一起使用?

python - sqlite3_mutex_enter() 上的访问冲突。为什么?

c - vi/vim - 根据代码中特殊文件或标签的存在自定义格式

c++ - 数组指针数组的析构函数

c++ - Win32 GDI 画一个圆?