*val 和 &val 在 C++ 中通过引用传递时有何不同
How *val and &val differ when passed by reference in C++
void funct( int *val1, int &val2)
{
*val1= 20;
val2= 22;
}
int main()
{
int v1=10, v2=12;
funct(&v1, v2);
cout<<"v1: "<<v1<<endl<<"v2: "<<v2<<endl;
return 1;
}
v1 和 v2 都是通过 funct() 引用调用的。但我不明白,除了语法差异之外,两种方式有什么区别。我想问的几个问题是,
- 两者是完全不同的事情吗?
- 两者在编码实践方面是否同样出色?
- 一个会工作,另一个不会工作的情况?
- 我可以使用一个做的其他事情,我不能使用其他做什么?
为了简化起见,我会打电话给:
int *val1 ------- Method 1
int &val2 ------- Method 2
我猜您正在尝试通过引用和指针来理解调用的功能。为了更多更好的理解,我建议您阅读这个问题的答案。
在C++中,通过指针传递比按引用传递有什么好处吗?
祝你好运!
回答您的问题:
-
两者是完全不同的事情吗?是和不是。您可能会得到相同的结果机器代码,但您在函数中使用它们的方式与您在自己的代码中看到的有所不同。因为您无法更改这些指针,并且您真的不想更改,所以引用更有意义。
-
两者在编码实践方面是否同样出色?在 C 中,您没有选择,但在C++中您应该使用引用。如果你传递数组,你可能会考虑C++存在数组(std::arrays),这些数组也可以被引用。您仍然可以将指针用于按引用返回方法,因为C++主要了解 C。
-
一个会工作,另一个不会工作的情况?对于 C 数组,常量指针可能会有所帮助,但您可以通过 STL(向量和数组)进行数据结构,它可以执行相同的操作并使用引用。
-
我可以使用一个做的其他事情,我不能使用其他做什么?好吧,指针比引用更强大,但我认为如果您想通过引用传递值,您获得的额外功能对您没有真正的帮助。还要记住,您仍然可以返回一个值,该值也可以由结构或类组成。如果您更喜欢返回值,则只能返回一个值(例如,与 Matlab 不同),但您可以通过其他数据类型定义将它们作为捆绑包返回。
注意:阅读提供的链接@hardydragon并附有精彩的解释
关于C++中的引用:
虽然这个问题在许多关于C++的书中都有解释,但让我试着专注于你的具体问题。
在 C 中,只有指针存在。您可以将它们作为"参考"传递。当引入C++时,引用就位了,您可以在其中定义
int &val2
但这里有一个问题,引用通常与指针做同样的事情,但你不能改变地址,因为没有对变量的直接地址访问。如果您访问C++引用,它将为您提供指向/引用的值,并允许您修改该值;它们像普通变量一样工作。在其定义的缺点方面,您必须立即告诉引用它引用的位置:
整数 a = 5;int &b = a;如果通过引用传递,则对于给定参数对函数具有相同的效果
指针可以在运行时指向 null、无效内容或内存中所需的任何内容。您可以随时更改地址。你也可以做指针算术,这是引用不可能实现的。当然,这很危险,但您可能已经知道为什么。
关于指针的问题是,人们会/对它们感到困惑,尤其是取消引用 (&) 运算符和指针 (*) 定义对许多人来说不清楚。考虑指针到指针并不能真正改善这种情况。因此,使用像C++这样的参考资料使许多人的生活更轻松。这并不意味着您不应该理解指针。关键是你的代码变得更具可读性。
因此,作为一般提示,因为您使用C++,请使用引用。由于它的限制,并不总是可以使用它们,但只要有可能,就会使用它们。
所以这是我的观点,但对于引用调用,你应该使用引用,除非有理由你不能。
就您提供的代码的功能而言,这两个函数之间没有区别:
void swap_with_addresses(int * a, int * b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
void swap_with_references(int & a, int & b) {
int tmp = a;
a = b;
b = tmp;
}
int main() {
int a = 5, b = 10;
std::cout << a << "," << b << std::endl;
swap_with_addresses(&a, &b);
std::cout << a << "," << b << std::endl;
swap_with_references(a, b);
std::cout << a << "," << b << std::endl;
return 0;
}
执行此代码将产生:
5,10
10,5
5,10
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 强制转换为引用类型
- 引用一个已擦除类型(void*)的指针
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 具有默认值的引用获取函数
- 如何使用基类指针引用派生类成员
- *val 和 &val 在 C++ 中通过引用传递时有何不同
- 有没有一种方法可以编写一个以l-val引用或r-val引用为输入参数的函数