按数据值传递参数
按值传递参数时,是将实参变量的值复制一个到临时存储中,如果在调用过程中改变了形参的值,不会影响实参变量本身,即实参变量保持调用前的值不变。
按地址值传递参数
按地址传递参数时,把实参变量的地址传送给被调用过程,形参和实参共用内存的同一地址。在被调用过程中,形参的值一旦改变,相应实参的值也跟着改变。
其中
这里定义了四个交换函数,
void swap1(int *p1, int *p2)
void swap2(int &p1, int &p2)
void swap3(int p1.int p2)
三种函数处理方式,在前两种种都会改变实参的值,只有最后一种按值传递不会改变实参的值。
于是得出今天晚上的最后一个结论,当 用指针作为传递参数时,你对函数形参的实际操作也会带来实参的变化。
这个是应该引起注意的。
#include<cstdio>
using namespace std;
void swap1(int *p1, int *p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
void swap2(int &p1, int &p2)
{ int temp;
temp=p1;
p1=p2;
p2=temp;
}
void swap3(int *p1,int *p2)
{
int *temp;
temp = p1;
p1 = p2;
p2 = temp;
}
void swap4(int a,int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main(int argc, char* argv[])
{
int a, b;
int *pointer_1,*pointer_2;
printf("方法1请输入两个数(a<b)\n");
scanf("%d %d", &a, &b);//输入变量值 在scanf里面放逗号 是傻逼
pointer_1=&a; pointer_2=&b;//让指针分别指向两个变量
if (a<b) swap1(pointer_1,pointer_2);//调用交换算法1
printf("\n%d %d\n", a, b);
printf("\n方法2:请输入两个数(a<b)\n");
scanf("%d %d", &a, &b);//输入变量值 在scanf里面放逗号 是傻逼
if (a<b) swap2(a, b); //调用交换算法2
printf("\n%d %d\n", a, b);
printf("\n方法3:请输入两个数(a<b)\n");
scanf("%d %d", &a,&b);//输入变量值 在scanf里面放逗号 是傻逼
pointer_1=&a; pointer_2=&b;//让指针分别指向两个变量
if (a<b) swap3(pointer_1,pointer_2); //调用交换算法2
printf("\n%d %d\n", a, b);
printf("\n方法3:请输入两个数(a<b)\n");
scanf("%d %d", &a, &b);//输入变量值 在scanf里面放逗号 是傻逼
if (a<b) swap4(a, b); //调用交换算法2
printf("\n%d %d\n", a, b);
return 0;
}
这里定义了四个交换函数,
第一个函数的形参是指针,对应的是实参的地址值,函数调用时将实参的地址值传递给形参指针,作为形参指针的值,使得形参指针指向实参地址对应的数据。函数通过间接访问方式,可以修改对应的值(注意交换时要交换两个恶形参指针指向的数据值,而不是地址值)。
第三个函数的形参也是指针,但结果是不能交换二者的值,因为函数swap交换的是形参的地址值(指针的指向),但没有进行a与b的交换。
第二个函数式运用引用作为函数的形参,引用是已存在变量的别名(alias),通过引用可以间接访问变量。可以改变变量的值(注意:引用和原变量是指向同一个内存地址的,系统不会为应用变量重新分配地址)
第四个函数就是采用传数据值的方式:调用swap时a和b的值拷贝给形参a和b,函数交换的是形参a和b的值而不会改变实参a和b的值