当通过C ++中的引用传递时,* val和&val的区别如何?
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 ++中通过引用传递指针会带来什么好处?
祝你好运!
就您提供的代码的功能而言,这两个函数没有区别:
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中,你没有选择,只能在C ++中使用引用。 如果你传递数组,你可能会想到,尽管存在可以被引用的C ++数组(std :: arrays)。 你仍然可以使用指针来引用返回方法,因为C ++主要知道C。
一个人会工作的情况下,其他人不会? 对于C数组,一个常量指针可能会有所帮助,但是通过STL(向量和数组)可以实现相同的数据结构和引用。
我可以用其他方法做什么,我不能用其他方法做什么? 那么,指针比引用更强大,但是我认为如果你想通过引用传递值,那么你得到的额外能力并不能真正帮助你。 还要记住,你仍然可以返回一个也可以由结构或类组成的值。 如果你喜欢返回值,只有一个是可能的(不像在Matlab中),但你可以通过其他数据类型定义将它们作为包返回。
注意:阅读由@hardydragon提供的链接,并带有一个很棒的解释
关于C ++中的引用:
虽然这个问题在很多关于C ++的书中都有解释,但让我试着专注于你的具体问题。
在C中只存在指针。 你可以通过它们作为“参考”。 当C ++被引入时,引用到达可以定义的地方
int &val2
但是这里有一个问题,引用通常和指针做同样的事情,但是你不能改变地址,因为没有直接的地址访问变量。 如果你访问一个C ++引用,它会给你你指向/引用的值,它将允许你修改该值; 他们像正常变量一样工作。 在定义的不利方面,你必须告诉参考立即引用它的地方:
int a = 5; int&b = a; //如果你通过引用传递它对你的函数的给定参数具有相同的效果
指针可以指向运行时为空,无效或无论你想在内存中的任何东西。 您可以在任何部分更改地址。 你也可以做指针算术,这是不可能的参考。 当然这很危险,但你可能已经知道为什么了。
关于指针的问题是,人们对它们感到困惑,特别是解引用(&)操作符和指针(*)定义对许多人来说是/不清楚的。 考虑指针指针并不能真正改善这种情况。 因此,使用C ++中的引用使得许多人的生活变得更加简单。 这并不意味着你不应该理解指针。 关键是你的代码变得更加可读。
因此,作为使用C ++的一般提示,请使用引用。 由于它的局限性,并不总是可以使用它们,但只要有可能就使用它们。
所以这是我的意见,但对于通过引用来调用,您应该使用引用,除非有原因您不能。
链接地址: http://www.djcxy.com/p/20737.html上一篇: How *val and &val differ when passed by reference in C++