《语法篇》按值传递和按地址传递
按值传递和按地址传递
参考链接:https://blog.csdn.net/scrence/article/details/79835572
参考链接:https://www.jb51.net/article/250343.htm
1、按值传递
#include<iostream>
using namespace std;
void changeNumber(int x);
int main(void)
{
int a = 10;
cout << "a = " << a << endl;
changeNumber(a);
cout << "Now a = " << a << endl;
return 0;
}
void changeNumber(int x)
{
x = x + 5;
}
其中a的值不变化,输出两次都为10。
原理是调用方法时,会重新找一块内存空间复制a,这个空间就是x,所以对x任何操作不会影响a。
2、按地址传递(指针参数)
#include<iostream>
using namespace std;
void changeNumber(int* x);
int main(void)
{
int a = 10;
cout << "a = " << a << endl;
changeNumber(&a);
cout << "Now a = " << a << endl;
return 0;
}
void changeNumber(int* x)
{
*x = *x + 5;
}
其中a的值变化,第一次为10,第二次为15
原理是changeNumber(int* x)声明中的int* 指参数地址,所以在调用时,使用&a取其地址,把地址传给方法中的x,这里x和a存的就是地址,并且地址相同,对x操作会影响到a。
3、按引用传递
什么是引用?引用就是给已有的变量取个别名。
// 引用必须在定义时就初始化,初始化后不能修改
int num=10;
int &a = num;// 其中a就是num的别名
// 下面这种就会报错
// int &b;
// b = num;
// 下面这种就会报错
// int count = 10;
// a = count;
按引用传递
void swap_int01(int a1, int b1)
{
int tmp = a1;
a1 = b1;
b1 = tmp;
}
void swap_int02(int *a1, int *b1)//a1=&a, b1=&b
{
//*a1 == a, *b1 == b
int tmp = *a1;
*a1 = *b1;
*b1 = tmp;
}
void swap_int03(int &a1, int &b1)//int &a1 = a, int &b1=b
{
//a1 == a, b1 == b
int tmp = a1;
a1 = b1;
b1 = tmp;
}
void test07()
{
int a = 10;
int b = 20;
cout<<"a = "<<a<<", b = "<<b<<endl;
// swap_int01(a, b);//交换 不成功
// swap_int02(&a, &b);//交换 成功
swap_int03(a, b);//交换 成功
cout<<"a = "<<a<<", b = "<<b<<endl;
}
int main(int argc, char *argv[])
{
test07();
return 0;
}
其中交换成功,是因为swap_int03(int &a1, int &b1)中int& 是声明引用,传入a后,a1就是a的别名,对a1操作会影响a。