C++函数参数传递和指针

参数传递:

1.值传递:

在这种情况下传给形参的是变量的值,而不是变量的地址,值是通过拷贝的方式传递给函数的形参的,这样值就到了一个新的内存里面。对其作出的任何改变都不会对原有值产生任何影响。

int main(){  
    void swap(int,int);//参数为整型变量  
    int i=3,j=4;  
    cout<<"i="<<i<<",j="<<j<<endl;  
    swap(i,j);//变量名  
    cout<<"i="<<i<<",j="<<j<<endl;  
    system("PAUSE");  
    return 0;  
}  
   
void swap(int a,int b){//形参为整型变量  
     int temp;  
     temp=a;  
     a=b;  
     b=temp;  
}  

 结果:

i=3,j=4

i=3,j=4

可以发现,执行函数swap后,形参a和b的改变不会影响实参i和j的值。

 

2.指针传递:

调用函数时,实参传递给形参的是实参的指针,所以形参保存的不是实参的值,而是指向值的地址。这个时候,形参不能改变自己的值,如果改变,它将找不到实参的值。它只能通过指针的方式,改变实参的值。这种方式下,内存里面还是有两个内存区,分别放实参和形参。

int main(){  
    void swap(int*,int*);//参数为整型指针变量  
    int i=3,j=4;  
    cout<<"i="<<i<<",j="<<j<<endl;  
    swap(&i,&j);//变量地址  
    cout<<"i="<<i<<",j="<<j<<endl;  
    system("PAUSE");  
    return 0;  
}  
   
void swap(int *p1,int *p2){//形参为整型指针变量  
     int temp;  
     temp=*p1;  
     *p1=*p2;  
     *p2=temp;  
}  

结果:

i=3,j=4

i=4,j=3

调用函数时把变量i和j的地址传送给形参p1和p2,因此*p1和i为同一内存单元,*p2和j是同一内存单元。

这种方式还是“值传递”,只不过实参的值是变量的地址而已。而在函数中改变的不是实参的值(即地址,这种改变也影响不到实参),而是实参地址所指向的变量的值。

 

3.引用传递:

 

在一开始理解引用传递的时候,我假想为(&形参 = 实参),就像指针传递(*形参 = 实参)一样,如此一来,我怎么都想不通引用传递的实质。其实真实情况是这样的(&形参 = &实参)。C++最大的缺陷就是设计的规则不统一,导致无法用类比的方式进行推理。所以,一直都没觉得它是一门好的语言。

int main(){  
    void swap(int&,int&);//参数为整型变量的引用  
    int i=3,j=4;  
    cout<<"i="<<i<<",j="<<j<<endl;  
    swap(i,j);//变量名  
    cout<<"i="<<i<<",j="<<j<<endl;  
    system("PAUSE");  
    return 0;  
}  
   
void swap(int &a,int &b){//形参为引用类型  
     int temp;  
     temp=a;  
     a=b;  
     b=temp;  
}  

结果:

i=3,j=4

i=4,j=3

当main函数调用swap函数时,由实参把变量名传给形参。i的名字传给引用变量a,j的名字传给引用变量b。此时a和b就分别与i,j占用同一内存空间。这种把实参地址传递到形参,使形参的地址取实参的地址,从而使形参与实参共享同一单元的方式,就是地址传递方式。

 

函数指针:

1.函数指针的基本使用:

 

2.函数指针作为参数传递:

(1)类多参成员函数作为参数传递:目前这个问题未解决。函数的地址不应该通过对象进行获取,而是应该通过类名来获取,因为它不是零时变量。

bool PerchWood::getCamera(CameraManager** camera)  
{  
    if (!m_cameraManager)  
    {  
        return false;  
    }  
  
    *camera = m_cameraManager;  
  
    return true;  
}  

 利用双指针实现指针的引用传递,是一个比较好的解决方式,这或许算是一个通用的写法吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值