在C语言中,通过引用传递参数和通过值传递参数有很大的区别
例一
#include <stdio.h>
void modify_num(int &b)
{
b=b+1;
}
int main() {
int a=10;
modify_num(a);
printf("after modify_num=%d\n",a);
return 0;
}
在这个例子中,使用了引用传递参数 int &b
,这意味着 modify_num
函数中的 b
是对 a
的引用。引用允许在函数中修改传递的变量的值,而不是创建传递变量的副本。因此,当在 modify_num
函数中修改 b
的值时,实际上就是在修改 a
的值。
例二
#include <stdio.h>
void modify_num(int b)
{
b=b+1;
}
int main() {
int a=10;
modify_num(a);
printf("after modify_num=%d\n",a);
return 0;
}
在这个例子中,使用了值传递参数 int b
。在这种情况下,modify_num
函数中的 b
是 a
的一个副本,对 b
的修改不会影响到原始的变量 a
。
并不是因为第一个例子传递的是地址 第二个例子只是传递的值
在C++中,引用不是传递地址,而是创建了一个别名(alias)或者说是给变量起了一个别名。引用相当于给变量取了一个别名,对引用的操作实际上就是对原变量的操作。
在第一个例子中,int &b
表示 b
是对 a
的引用,而不是对 a
的地址。引用和指针是不同的概念。引用在使用时更类似于变量的别名,而指针存储了变量的地址。
在第二个例子中,使用的是值传递,参数 int b
接收的是 a
的值的副本。对 b
的修改不会影响原始的变量 a
,因为只有副本被修改了。
总结:引用是创建一个别名,对引用的操作实际上是对原变量的操作,而值传递则是传递变量的副本,对副本的操作不会影响原始变量。
关于副本的介绍
在C++中,当通过值传递参数时,函数接受的是原始数据的副本,而不是直接访问原始数据的地址。这意味着在函数内部对参数的任何修改都只影响到函数内的副本,而不会影响调用函数时传递的实际变量。
考虑下面的例子:
使用了引用传递参数 int &b
#include <stdio.h>
void modify_num(int &b) {
b = b + 1;
}
int main() {
int a = 10;
modify_num(a);
printf("after modify_num=%d\n", a);
return 0;
}
int &b
表示 b
是对变量 a
的引用。modify_num
函数确实修改了原始变量 a
,输出将是 "after modify_num=11"。
在这个例子中,modify_num
函数接受 a
的引用,对引用的修改实际上是对原始变量 a
的修改。因此,输出将是 11
,因为在函数内部成功修改了原始变量。
相比之下,如果使用引用传递参数 int b
,如下所示:
#include <stdio.h>
void modify_num(int b) {
b = b + 1;
}
int main() {
int a = 10;
modify_num(a);
printf("after modify_num=%d\n", a);
return 0;
}
在这个例子中,modify_num
函数接受 a
的值的副本,即 b
是 a
的一个复制品。当在 modify_num
函数内部对 b
进行修改时,只是修改了这个副本,不会影响到原始的变量 a
。所以,输出仍然是 10
。