通过引用和指针传递参数
Passing arguments by reference and pointers
我来自C,我了解到,如果我们将一个参数传递给一个函数,它只会用它的值复制它,所以如果我们更改这个变量值,传递给函数的变量不会更改,因为它们显然是两个不同的变量,有两个不同地址,只是具有相同的值。因此,在C中,如果我们想更改传递给函数的参数,我们会传递一个带有参数地址的指针。
现在,在c++中,我们可以做同样的事情,但我们也可以这样做:
void changeValue(int& n)
{
n = 10;
}
我们不仅没有去引用来赋值,而且当我们将变量传递给函数时,我们会在不使用地址(&)运算符的情况下原样传递。所以我不明白这里有什么区别?如果我们不取消引用,它甚至是一个指针吗?同样,如果我们在没有&运算符我们是如何通过引用传递它的?有人能帮我清理一些东西吗?
C++有指针(以保持与C的向后兼容性)和引用。正如您所提到的,对于指针,您需要处理地址、取消引用运算符等。对于C++引用,您不必担心这一点,因为引用是其他变量的别名。也就是说,对引用所做的任何修改都将反映在实际变量中。
引用可以由编译器实现为指针,但不需要。
当你想重载运算符时,引用真的会发光发热。例如,如果您构造一个自定义数字类型来表示矩阵,则可以创建一个加法运算符,如
matrix operator + (matrix m1, matrix m2);
但这会招致大量的抄袭。你可以使用指针:
matrix operator + (matrix* m1, matrix* m2);
但是调用代码会非常难看:
matrix m = &m1 + &m2;
引用允许我们以避免复制的方式编写运算符,并允许我们在呼叫站点干净地使用它,而无需访问运算符的地址。
总之:C++中的引用与指针相似,因为它们允许您通过多个变量引用同一个值。然而,与需要使用内存地址的指针不同,引用是一种语法上的便利,谁的实际实现取决于编译器。
我希望这能有所帮助。
相关文章:
- 使用指向成员的指针将成员函数作为参数传递
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 修改函数中的指针(将另一个指针作为参数传递)
- Clang bug?使用指针作为模板参数
- MSVC将仅移动结构参数解释为指针
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 如何使用非类型模板参数传入指向数组的指针
- 将成员函数指针作为参数传递给模板方法
- 匹配函数指针作为模板参数?
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 通过智能指针和转换对基本模板参数进行模板推导
- 为函数定义符号不明确的指针参数
- 使用引用与指针将数组作为参数传递
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- 将函数参数完美转发到函数指针:按值传递呢?
- 保留函数指针模板参数
- 如何构造一个以可变参数指针函数作为成员的类?
- 指向对象的非类型模板参数指针
- c++ 使用 *& as 参数(指针乐趣,三级树方法)