可能重复:
按引用传递与按值传递有什么区别?
我读到在 C 中参数是按值传递的,但是按值传递参数(如在 C 中)或通过引用(如 C++ - C#)传递参数有什么区别?指针和引用有什么区别?
void with_ptr(int *i)
{ *i = 0; }
void with_ref(int &i)
{ i = 0; }
在这些情况下是否修改了这两个值?如果是,为什么 C++ 允许通过引用传递参数?我认为函数内部不清楚 i 值是否可以修改。
可能重复:
按引用传递与按值传递有什么区别?
我读到在 C 中参数是按值传递的,但是按值传递参数(如在 C 中)或通过引用(如 C++ - C#)传递参数有什么区别?指针和引用有什么区别?
void with_ptr(int *i)
{ *i = 0; }
void with_ref(int &i)
{ i = 0; }
在这些情况下是否修改了这两个值?如果是,为什么 C++ 允许通过引用传递参数?我认为函数内部不清楚 i 值是否可以修改。
按值传递参数或按引用传递参数有什么区别
如果按值传递,则对变量的更改将是函数的局部变量,因为在调用函数时会复制该值。对引用参数的修改将传播到原始值。
指针和引用有什么区别?
正如您在代码中看到的那样,区别主要在于语法。此外,可以重新分配指针以指向其他内容(除非已声明const
),而引用则不能;相反,分配给引用将分配给被引用的值。
我认为函数内部不清楚 i 值是否可以修改。
相反,它是绝对清楚的:函数签名告诉你。
实际上有一个案例是在函数之外并不清楚。ref
这就是为什么例如 C# 的原始版本要求您使用(即f(ref x)
,而不是 plain f(x)
)显式注释任何引用调用。这类似于在 C++ 中调用函数f(&x)
来明确传递一个指针。
但是在最近的 C# 版本中,使用ref
for 调用是可选的,因为它毕竟没有提供足够的优势。
考虑一下:
1) 通过引用传递提供了更简单的元素访问 i
,而不是*i
2)通常你不能传递null
对方法的引用,但可以传递一个null
指针
3) 不能改变引用的地址,但可以改变它为一个指针(虽然,由于指针本身是按值传递的,这个改变会在函数退出时被丢弃)
希望,这有点帮助
实际上,在第一种情况下,您不能修改参数。指针本身是不可变的,你只能修改它指向的值。
如果是,为什么 C++ 允许通过引用传递参数?
因为指针很容易被误用。几乎总是首选参考文献。对于您的情况,如果您通过NULL
towith_ptr
怎么办?您将获得未定义的行为,如果您使用with_ref
.
我认为函数内部不清楚 i 值是否可以修改。
很清楚。如果您看到一个通过非引用获取参数的函数const
,您可以假设它会被更改。
我认为一个方法只能改变一个参数的值,如果这是通过引用传递的。如果您在方法中按值传递参数,那么无论您对其值进行什么更改,这在父方法中都将不可用。
据我所知,我认为引用在某种意义上更安全,因为它不能被修改(总是指向同一个东西),如果它是一个局部变量则应该被初始化。但是,指针可以更改为指向其他地方。
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