按值和参考传递参数有什么区别?

时间:2012-05-15 09:40:33

标签: c++ c pass-by-reference pass-by-value

  

可能重复:
  What's the difference between passing by reference vs. passing by value?

我读到C语句中的参数是通过值传递的,但是通过值传递参数(如在C中)或者通过refencence(如C ++ - C#)之间的区别是什么? 指针和引用之间有什么区别?

void with_ptr(int *i)
{ *i = 0; }

void with_ref(int &i)
{ i = 0; }

在这些情况下修改两个值?如果是,为什么C ++允许通过引用传递参数?我认为在函数内部并不清楚i值是否可以被修改。

5 个答案:

答案 0 :(得分:10)

  

通过值或引用传递参数之间的区别是什么

如果通过值传递,对变量的更改将是函数的本地变量,因为在调用函数时,值是复制。对引用参数的修改将传播到原始值。

  

指针和引用之间有什么区别?

正如您在代码中看到的那样,区别在于语法。此外,可以重新指定指针以指向其他内容(除非它被声明为const),而引用则不能;相反,分配给引用将分配给引用的

  

我认为在函数内部并不清楚i值是否可以被修改。

相反,它绝对清楚:函数签名告诉你。

实际上有一个案例是之外这个功能。这就是为什么C#的原始版本强制要求您使用ref显式注释任何按引用调用(即f(ref x)而不是普通f(x))的原因。这类似于使用f(&x)在C ++中调用函数来清楚地传递指针。

但是在最新版本的C#中,使用ref进行调用是可选的,因为它毕竟没有给予足够的好处。

答案 1 :(得分:2)

考虑一下:

1)通过引用传递提供更简单的元素访问i而不是*i

2)通常你不能将null引用传递给方法,但可以传递null指针

3)你不能改变引用的地址,但是可以为指针改变它(虽然,当指针本身按值传递时,这个改变将在函数退出时被丢弃)

希望,这有点帮助

答案 2 :(得分:1)

实际上,在第一种情况下,您无法修改参数。指针本身是不可变的,你只能修改它指向的值。

  

如果是,为什么C ++允许通过引用传递参数?

因为指针很容易被错过使用。几乎总是应该优先考虑参考文献。对于您的情况,如果您将NULL传递给with_ptr该怎么办?您将获得未定义的行为,如果您使用with_ref,则无法执行此操作。

  

我认为在函数内部并不清楚i值是否可以被修改。

非常清楚。如果您看到一个函数通过非const引用获取参数,则可以假设它将被更改。

答案 3 :(得分:0)

我认为一个方法只能改变一个参数的值,如果这是通过引用传递的。如果您在方法中按值传递参数,那么无论您对其值进行何种更改,都将无法在父方法中使用。

答案 4 :(得分:0)

据我所知,我认为引用更安全,因为它无法修改(总是指向同一个东西),如果是局部变量则应该初始化。但是,指针可以改为指向其他地方。

int x = 10;
int &y = x;
int *p = &x;
p++; //Legal if you know what's next
y++; // Increases the value of x. Now x = y = 11;

作为我的两分钱,我认为引用变量仅仅是初始化它的相同内存地址的替代名称。这也解释得很好: http://www.dgp.toronto.edu/~patrick/csc418/wi2004/notes/PointersVsRef.pdf