我们看看下面这三个代码(手机端显示乱码的朋友可以看最下面的代码,和此处的三个例子一样)
1 2 3
void show(int& b) { void show(int b){ void show(int *b){
cout << b << endl; cout << b << endl; cout << *b << endl;
b = 20; b = 20; *b = 20;
} } }
int main() { int main() { int main() {
int a = 10; int a = 10; int a = 10;
show(a); show(a); show(&a);
cout << a << endl; cout << a << endl; cout << a << endl;
} } }
输出: 输出: 输出:
10 10 10
20 10 20
我们发现,只是稍稍修改了几个符号就得到了不同的结果,而这几个例子就体现了一个概念
----->函数传参
函数传参有三种方式-------> 1.引用 2.值 3.地址
1.引用
例1中的用到了一个定义引用的概念
这里我们举一个小例子
#include<iosrteam>
using namespace std;
int main(){
int a = 10;
int& b = a;//&定义引用,必须引用一块使用的空间,不能只写int &b;
cout << &b << endl;
cout << &a << endl;
}
输出:
0000002CE33AF624
0000002CE33AF624
大家可以发现两个变量的地址是一样的
原因可在下面关于指针和引用的区别总结中得知
// & 在这里是定义一个引用,定义引用时必须引用一块使用的空间,即初始化设置项,例如在上面的代码中的 int &b = a; 不能写成 int &b; b = a;
2.值
例2中的void show(int b),这个里面的b只是一个形参
b = 20只会改变 b 这个形参的数值,不会影响到 a 这个实参
所以得到的结果是10 10
3.地址
例3中的show(int* b)里面的参数 b 是一个地址,你把 a 的地址给了show()里的参数b
当你改变 *b 这个数时,改变的是对应地址中储存的数字
因为变量 a 对应这个地址,所以 a 的数值也会随之发生变化
关于指针和引用的区别小总结:
1.定义引用时必须要初始化引用一块空间 , 指针可以不用初始化
2.一旦引用了一块空间就不能再引用其他空间 , 指针可指向任意的符合类型的空间
3.定义引用时不会额外开辟空间 (所以上面输出的 a 和 b 的地址相同), 指针有自己存储地址的空间
————————————————
1.
void show(int& b) {
cout << b << endl;
b = 20;
}
int main() {
int a = 10;
show(a);
cout << a << endl;
}
输出:
10
20
2.
void show(int b) {
cout << b << endl;
b = 20;
}
int main() {
int a = 10;
show(a);
cout << a << endl;
}
输出:
10
10
3.
void show(int* b) {
cout << *b << endl;
*b = 20;
}
int main() {
int a = 10;
show(&a);
cout << a << endl;
}
输出:
10
20