我是学习C ++的新手。我试图理解在哪些条件下我们将指针作为函数参数传递。根据我的理解,当我们将指针作为函数的参数传递时,它会覆盖最初存储的值。我们通过引用传递的情况也是如此。还有其他原因吗?请尝试使用简单的语言解释这一点,以便我能理解。
// pass a reference
void Foo(int &x)
{
x = 2;
}
//pass a pointer
void Foo_p(int *p)
{
*p = 9;
}
// pass by value
void Bar(int x)
{
x = 7;
}
int main()
{
int x = 4;
cout<< "before function call "<< x<< endl;
Foo(x); // x now equals 2.
cout<< "after first call x is "<< x <<endl;
Foo_p(&x); // x now equals 9.
cout<< "after second call x is "<< x <<endl;
Bar(x); // x still equals 9.
cout<< "after third call x is "<< x <<endl;
}
答案 0 :(得分:3)
没有简单的规则。
相反,您必须了解指针在C ++中的作用和含义,以及它们在您当前代码库中的含义。
编程是关于与编译器以及与其他程序员进行通信,以及将来与您自己进行通信。在所有这些情况下,指针或引用的使用都有不同的含义。
指针是一张纸,上面有街道地址。如果我把一张纸和你的房子一起递给你,你可以用它来派遣施工人员去毁坏,改变或重建我的房子。
价值是实际的东西。如果我通过你的实际房屋的副本,你可以对那所房子做的任何事情都不会影响我原来的房子。
引用是值的别名。
写上房子地址的那张纸本身就是一个价值。我可以给你另一张纸,并使用第二张纸,你可以让一个抄写员重写第一张纸。
使用引用时,没有值,只有对另一个值的引用。
您可以将引用视为一个指针,阻止任何人更改它,并且您无法获得指向指针的指针。
此外,与引用不同,指针是可以为空的&#34; - 他们可以处于他们什么都不提的状态。作为价值观的指针可以改变;按照惯例,可以将指针传递给元素数组的第一个元素,加上长度,并期望用户复制和/或修改该指针以引用所有元素。
作为值的指针,可以对它们执行操作(与它们指向的相反)。如果你有一个街道上的房子的地址,你可以在街上找到下一个房子&#34; (递增指针)。但是,如果你在最后一所房子之后要求这所房子,那么你会感到懊恼。
所有这些都是 。传统上,程序员基本上从不使用引用来保存自由存储分配的对象(&#34;堆&#34;对象),而指针有时会这样做。在某些代码库中,只有智能指针&#34;拥有&#34;这样的参考,而其他人只观察。
在某些代码库中,使用指针来表示可空引用是有效的;在其他方面,这是诅咒。