在哪些条件下,我们将指针作为函数参数
Under which conditions we pass pointers as function argument?
我是学习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;
}
没有简单的规则。
相反,您必须了解指针在C 中的意思,以及它们在您当前的代码库中的含义。
编程是关于与编译器以及其他程序员以及将来与您自己进行沟通。在所有这些情况下,指针或参考都有不同的影响。
指针是一张纸,上面有街道地址。如果我把一张纸上的纸上放在我的房子上,您可以用它来派遣建筑人员销毁,更换或重建我的房屋。
值是实际的。如果我将您的实际房屋的副本传递给您,那么您无能为力会影响我的原始房屋。
参考是对值的别名。
纸上写有房屋地址的纸本身就是一个价值。我可以给你另一张纸来指代,然后使用第二张纸,您可以得到抄写员来重写第一张纸。
有了参考,没有 value ,只有对另一个值的引用。
您可以将参考视为防止任何人更改的指针,并且无法获得指针的指针。
此外,与参考不同的指针是"无效的" - 它们可以处于无所事事的状态。指针本身可以改变。按照惯例,可以将指针传递给元素数组的第一个元素,以及长度,并希望用户复制和/或修改该指针以参考所有元素。
Pointers是价值,您可以对它们执行操作(而不是指向它们的指向)。如果您有街道上房屋的地址,则可以"在街道上获得下一所房子"(递增指针)。但是,如果您在最后一所房子之后要求房子,请遇到您。
所有这些都是它们。从传统上讲,程序员基本上永远不会使用参考来持有免费存储分配的对象("堆"对象),而指针有时会这样做。在某些代码库中,只有智能指针"拥有"此类引用,而其他参考则只观察。
在某些代码库中,使用指针来表示无效的参考是有效的;在其他情况下,这是厌食症。
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 当从函数参数中的临时值调用复制构造函数时
- 如何从"decltype()"获取函数参数的数量<funtion>?
- 如何将lambda作为模板类的成员函数参数
- 模板参数推导失败,函数参数/参数不匹配
- 如何在C++中将迭代器作为函数参数传递
- 将函数参数"const char*"转换为"std::string_view"是
- C++ 如何将数组值解压缩为函数参数
- 主函数参数的属性
- 具有两个间接寻址运算符 (C++) 的函数参数的用途
- "Warning: Comma within array index expression"但逗号分隔函数参数
- 如何定义在用作函数参数时工作的类模板的转换
- 将函数参数完美转发到函数指针:按值传递呢?
- 为什么我不能将引用作为 std::async 的函数参数传递
- 什么..(省略号)作为函数原型中唯一的函数参数,C++?
- 是否可以就地构造一个固定大小的数组作为函数参数?
- 接受模板作为函数参数
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- Arduino 函数参数