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/