C++ 为什么和什么时候值得使用指针对指针?
可能重复:C++ 为什么和什么时候值得使用指针对指针?,c++,pointers,C++,Pointers,可能重复: 你好, 虽然我认为我已经通过了编程的新手阶段,但我仍然有一些问题无法解释。是的,这里有很多“怎么做”,但几乎总是没有人解释为什么和/或何时一种技术是有用的 在我的例子中,我发现在某些情况下,指针的指针在C++中使用。指向对象的指针还不够吗?有哪些好处?应该在何处或何时使用指向指针的指针?在这件事上我感到有点不知所措 我希望有时间经验的专家能够对这种担忧做出回应,希望其他没有经验的编程人员也能这样做 谢谢大家 朱伦。实际上有两个用例 首先,当您调用一个必须返回多个值的函数时,其中一些
你好, 虽然我认为我已经通过了编程的新手阶段,但我仍然有一些问题无法解释。是的,这里有很多“怎么做”,但几乎总是没有人解释为什么和/或何时一种技术是有用的
在我的例子中,我发现在某些情况下,指针的指针在C++中使用。指向对象的指针还不够吗?有哪些好处?应该在何处或何时使用指向指针的指针?在这件事上我感到有点不知所措
我希望有时间经验的专家能够对这种担忧做出回应,希望其他没有经验的编程人员也能这样做 谢谢大家朱伦。实际上有两个用例 首先,当您调用一个必须返回多个值的函数时,其中一些值是指针。然后,您将为她提供一个指针的地址,以便它可以填充指针:
int *p1 = 0, *p2 = 0, *p3 = 0;
multi_malloc(&p1, &p2, &p3); // Allocates three pointers
第二个是当您要执行稀疏二维阵列时:
int main(int argc,char**argv)
这是指向指针的指针。argv[i]是指向char的指针。这样,argv[i][j]是第i行中的字符j
您会很高兴听到指针对指针几乎没有任何用途<代码>国际***p代码>几乎从来都不有用。
指针的指针在C中最具相关性,在C++中需要它们。在那里,您可以使用std库中的容器或引用
不过,在C中有两种流行的用例:在C语言中,一个参数通过一个指针传递给一个改变它的函数。对于C或COM(或COM/XPCOM),您将看到与C++相同的旧代码或遗留代码(<代码> int main(int ARC,CHAR**ARGV) >)。
从“纯C++的角度来看,使用指针指向指针在大多数情况下都是糟糕的编码风格的标志,因为大多数需要
**
构造的情况都可以(而且应该)进行重构,以使用更安全的替代方案(如std::
容器或*&
参数)。,要回答这样一个笼统的问题有点困难
< C++程序员的第一个答案肯定是:不要在C++中使用指针!由于您有许多比指针更安全的方法来处理问题,因此您的目标之一是首先避免它们:)
<指针>指针在C++中很少使用。它们主要用于C。首先,因为在C中,字符串是“char*”,所以当您需要“指向C字符串的指针”时,您会以“char**”结尾。其次,由于在C中没有引用,当您需要一个修改指针或将指针作为输出值的函数时,您需要将指针指定给指针参数。您通常会在分配内存的函数中发现这一点,因为它们给您一个指向已分配内存的指针
如果你走C++的方式,尽量避免指针,你通常有更好的方法。
my2c我可以想到两个用例 一种是继承自C的数组。在许多情况下,数组自动衰减为指向其第一个元素的指针。如果您碰巧有一个指针数组,则会得到一个指向该数组指针的指针。
(当你有一个
std::vector
指针时,也会发生类似的事情,顺便说一句:指针是一个完美的随机访问迭代器,我确实见过std-lib实现使用std::vector::迭代器的指针。对于std::vector
指针,v.begin()
将返回指向指针的指针。)
另一个用于函数参数。对于函数参数,每个指针取一个值表示调用者可能调用函数,即使他们没有要传递的对象;然后,它们可以传入NULL
。(否则,为什么要使用指针而不是引用?有关详细信息,请参见。
对指针进行非const
引用将表明被调用函数可能会为该指针分配新地址。
因此,如果调用方传入指向指针的指针,那么将指针指向指针将表明函数可能会为指针分配新地址,但也可以使用NULL
调用。
例如:
void f(int** ppi);
void g(int i);
void h()
{
f(NULL); // call `f()` only for its side-effects
int* pi = NULL;
f(&pi); // call `f()` and get some object in *pi
if(pi)
g(*pi); // use result
}
应该在何处或何时使用指向指针的指针
在一个函数中,如果调用者请求,可以选择返回指向调用者的指针。系统API、某些COM对象等经常使用
int f(void** p = 0){
//.......
}
若调用者提供了p,那个么函数将指针传递给p。若调用方不提供p,则不返回指针。在某些情况下,可能有助于调试
有哪些好处
这个问题太宽泛了。看,这是一种非常简单的技术,没有什么神秘的好处。你在必要的时候使用它。这就是全部。这个概念没有隐藏的意义,也没有秘密的好处——它相当于问“在英语中使用字母“e”有什么好处” 您仅在使用手动内存管理时使用它们,