首页 > 代码库 > 关于函数传参--传指针,传引用

关于函数传参--传指针,传引用

    今天和同学讨论到指针和引用的传递问题,有些想法从推理上讲是正确的,但是因为是推理,说出自己观点的时候不是那么有底气,本着实践是检验真理的唯一标准的原则得意,在电脑上敲了几段代码,验证了推理的正确性。 先上代码,再分析。

代码1:

void Swap0(int a1,int b1){
    int temp;
    temp=a1;
    a1=b1;
    b1=temp;
}

void Swap1(int *a1,int *b1){ //交换地址
    int *temp;
    temp=a1;
    a1=b1;
    b1=a1;
}

void Swap2(int *a1,int *b1){
    int temp;
    temp=*a1;
    *a1=*b1;
    *b1=temp;
}

void Swap3(int &a1,int &b1){
    int temp;
    temp=a1;
    a1=b1;
    b1=temp;
}
int main(){
    int a=1,b=2;
    Swap0(a,b);
    cout<<"Swap0 a:"<<a<<" b:"<<b<<endl;
    Swap1(&a,&b);
    cout<<"Swap1 a:"<<a<<" b:"<<b<<endl;
    Swap2(&a,&b);
    cout<<"Swap2 a:"<<a<<" b:"<<b<<endl;
    a=1;b=2;
    Swap3(a,b);
    cout<<"Swap3 a:"<<a<<" b:"<<b<<endl;
    return 1;
}
运行结果:

    关于Swap0(int a1,int b1),当调用这个函数时,main函数中的a=1,b=2会把1和2,这两个值传递给Swap0()中的a1和b1,Swap0()中的a1和b1是这个函数的局部变量,他们只是接受了1和2这两个值,并在函数内部将这两个局部变量的值做了交换,和main()中的a,b不存在关联也就是对main()中的a,b的值没有影响,所有执行Swap0后输出的值还是a为1,b为2。

    关于Swap1(int *a1,int *b1)和Swap2(int *a1,int *b1)它们的参数是一样的,不同的是Swap1的函数内部操作的是指针,而Swap2使用的是解引用*,有什么不同呢,从内存的角度来分析:main函数中定义了a和b,并且赋值为1和2,可以理解为系统为a分配了一块内存来存储1,为b分配了一块内存来存储2,我们可以先假设分配给a的内存的起始地址为1000,b的是1004,也就是&a=1000,&b=1004。调用Swap1(int *a1,int *b1),把这两个地址分别传递给a1,b1,也就是a1=1000,b1=1004,对指针变量的值进行交换,只不过是变成了a1=1004,b1=1000,变得只是a1,b1这两个指针变量的值,对a和b的内存没有影响,所以输出结果还是a=1,b=2。但是Swap2就不同了,它进行了解引用操作,*a1表示他获得了1000这个地址的值,并对这个地址上的数据进行操作(重点是要理解这个解引用操作,百度百科解释点击打开链接)它操作的是这块内存,所以它能成功修改a和b的值。

    关于Swap3(int &a1,int &b1)它是传递引用,引用是变量的别名,和操作a,b这两个变量一样,所以能够改变a,b的值。

代码2:

typedef struct{
    int a;
}A;

void f1(A *p){
    p->a=p->a+1;
}

void f2(A *p){
    (*p).a=(*p).a+1;
}

int main(){
    A p;
    p.a=1;
    f1(&p);
    cout<<"f1 p.a="<<p.a<<endl;
    p.a=1;
    f2(&p);
    cout<<"f2 p.a="<<p.a;
    return 1;
}

运行结果:

    关于f1(A *p),它传递的也是地址,在函数内部使用这个符号“->”它操作的是这个地址对应的内存中的数据,所以可以修改成员的值。f2(A *p)同样是解引用操作参见上面的Swap2。

    如有错误,多谢指正。