# 1. 直接传值
函数内部的计算并不会影响全局变量;也就是形参的改变不影响实参;
#include<iostream>
using namespace std;
void add(int a, int b)
{
a = a + b;
cout << a<< " "<< b<<endl;
cout << &a<<endl;
}
int main()
{
int a = 1;
int b = 2;
add(a, b);
cout << a<<" "<<b<<endl;
cout << &a<<endl;
return 0;
}
/*
3 2
0x7ffc185a631c
1 2
0x7ffc185a6338
*/
输出结果显示,形参变化,并未影响到实参;并且二者存放的地址也不一样。
# 2. 传指针
-
形参和实参指针的地址不同,但是指向同一个地址;
-
修改函数内部指针指向的地址的值会影响到外部变量;
-
修改函数内部指针的指向,不会影响外部指针;
#include<iostream>
using namespace std;
void add(int *a, int *b)
{
*a = *a + *b;
cout << *a<<endl;
cout << a<<endl;
cout << &a<<endl;
int d = 11;
a = &d;
cout << *a<<endl;
cout << a<<endl;
cout << &a<<endl;
}
int main()
{
int c = 1;
int b = 2;
int* a;
a = &c;
add(a, &b);
cout << *a<<endl;
cout << a<<endl;
cout << &a<<endl;
return 0;
}
/*
3
0x7fff6d3ff62c
0x7fff6d3ff5f8
11
0x7fff6d3ff60c
0x7fff6d3ff5f8
3
0x7fff6d3ff62c
0x7fff6d3ff620
*/
# 3. 传引用
&可以用来申明引用和取地址;
## 3.1 引用
二者的区别可以从定义看出来:
- 引用变量是一个变量的别名,就是给已经存在的变量取一个新的名字。记住:
- 1)不存在空引用;
- 2)引用被初始化为一个对象,就不能被指向到另一个对象;
- 3)引用必须在创建时被初始化。
- 4)对引用的操作就是对原变量的操作
创建引用:
类型名 & 别名 = var;
## 3.2 取址符
获取变量在内存中的储存地址;一般赋值给指针;
## 3.3 引用作为参数的实例
#include<iostream>
using namespace std;
void add(int &a, int &b)
{
a = a + b;
cout << a<< " "<< b<<endl;
cout << &a<<endl;
}
int main()
{
int a = 1;
int b = 2;
add(a, b);
cout << a<<" "<<b<<endl;
cout << &a<<endl;
return 0;
}
/*
3 2
0x7fff5baba32c
3 2
0x7fff5baba32c
*/
对引用操作就是对变量直接操作,因此函数内部对形参的改变会直接改变外部变量。
# 4. 总结
- 值作为函数参数:不影响实参
- 函数内部的计算并不会影响全局变量;也就是形参的改变不影响实参;
- 指针作为函数参数:影响实参
- 形参和实参指针的地址不同,但是指向同一个地址;
- 修改函数内部指针指向的地址的值会影响到外部变量;
- 修改函数内部指针保存的地址,不会影响外部指针保存的地址;
- 引用作为函数参数:影响实参
- 对引用操作就是对变量直接操作,因此函数内部对形参的改变会直接改变外部变量。
网友评论