Pointer arguments for functions
有一件事我无法理解,那就是什么时候在函数中使用某些类型的指针作为参数。
考虑一个接收整数作为参数的函数,并加倍该值可能是什么。其功能可能是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | void doubleTheValue(int *myNum) { *myNum *= 2; } int main() { int number = 2; doubleTheValue(&number); // prints 4 cout << number << endl; return 0; } |
这对我来说是有意义的。函数接收一个整数指针,然后传入对变量"number"的引用,它将更改该值。现在,让我困惑的是,如果你改为这样做:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | void doubleTheValue(int &myNum) { myNum *= 2; } int main() { int number = 2; doubleTheValue(number); // this also prints 4 cout << number << endl; return 0; } |
注意,函数的参数不同。这究竟是在内部做什么,为什么要在前面提到的方法上使用它呢?
What exactly is this doing internally, and why would you use it over the aforementioned method?
在第一个示例中:
1 2 3 4 | void doubleTheValue(int *myNum) { *myNum *= 2; } |
您正在向函数传递指针。指针具有实现定义的大小。例如,在64位体系结构中,指针的大小可能是8字节。在这种情况下(一般来说,对于基元类型),传递指针而不是引用(见下一段)会产生反效果。
在第二个示例中:
1 2 3 4 | void doubleTheValue(int &myNum) { myNum *= 2; } |
您正在传递对函数的引用。主要的区别是一个引用根本不需要占用任何内存。
关于引用和指针之间的其他区别,我建议您看看这个问题。但一般的经验法则是,你可以随时使用引用。您将发现在特定情况下(例如,当您想要接受一个空值时)需要使用指针。
What exactly is this doing internally, and why would you use it over the aforementioned method?
您应该理解指针和引用之间的区别。在许多情况下,我们不能使用引用来做一些事情,我们可以使用指针来做这些事情。尽管引用不需要任何内存,它们只是指向内存位置的标记,但是与指针相比,指针要比引用强大得多。主要区别在于:
1-指针可以重新分配任意次数,而引用在初始化后不能重新分配。
2-指针可以指向空,而引用不能指向空。
3-不能像使用指针那样使用引用的地址
4-没有"引用算术"(但您可以获取引用指向的对象的地址,并在其上执行指针算术,如&;obj+5中所示)
从操作开始,在原始帖子的评论中:
Neither of this really give any use for applications nor explain why you would use one over the other which is what I am curious about.
我的印象是,人们大多使用引用,因为它们使代码看起来更干净,所以没有太多的