c/c++函数参数的传递

c中函数参数传递有两种方式:值传递,指针传递。c++中函数的参数有三种:值传递,指针传递,引用传递。

我写了四个函数,很简单的如下:

void swap1(int p ,int q)

{

     NSLog(@"swap1 p的地址:%p,q的地址:%p",&p,&q);

    int temp=p;

    p=q;

    q=temp;


}


void swap2(int*p ,int* q)

{

     NSLog(@"swap2 p的地址:%p,q的地址:%p",p,q);//分别就是a,b的地址

    int temp=*p;

    *p=*q;

    *q=temp;


}


void swap3(int*p,int *q)

{

   

  NSLog(@"swap3 p的地址:%p,q的地址:%p",p,q);

    int* tem=p;  //交换指针,也只是交换pq行参.并没有实际交换ab实参的地址

    p=q;

    q=tem;

  NSLog(@"swap3 p的地址:%p,q的地址:%p",p,q);


    

}


void swap4(int& p ,int& q)

{

 NSLog(@"swap4 p的地址:%p,q的地址:%p",&p,&q);

    int temp;

    temp=p;

    p=q;

    q=temp;

    

}


以下是xcode测试。

-(void)awakeFromNib

{


    [textView setUsesFontPanel:YES];

    

    int a=1;

    int b=2;

  

    

     NSLog(@"交换前:a的地址:%p,b的地址:%p",&a,&b);

   swap1(a, b); //交换不成功。

    //  swap2(&a, &b); //可以交换成功

   // swap3(&a, &b); //交换不成功,a,b实际的地址也没交换

  //  swap4(a, b);//交换成功

    NSLog(@"交换后 a的地址:%p,b的地址:%p",&a,&b);

    

 //   swap3中,形参pq会保存在栈中,p指向a的地址,q指向b的地址,使用temp指针完成了pq的地址交换,即p指向b的地址,q指向了a的地址,但ab地址中的值并未发生变化,这与swap2不同,swap2中是p指向的地址中的值(就是a)q指向的地址中的值(b)交换,所以swap2执行完后ab的值是交换了的。

    

    NSLog(@"a=%d,b=%d",a,b);

    

    

    

}


调用swap1的输出信息:

2014-05-28 14:39:37.337 SandBox[5263:403] 交换前:a的地址:0x7fff5fbff49c,b的地址:0x7fff5fbff498

2014-05-28 14:39:37.338 SandBox[5263:403] swap1 p的地址:0x7fff5fbff45c,q的地址:0x7fff5fbff458

2014-05-28 14:39:37.339 SandBox[5263:403] 交换后 a的地址:0x7fff5fbff49c,b的地址:0x7fff5fbff498

2014-05-28 14:39:37.339 SandBox[5263:403] a=1,b=2

swap1函数采用值传递,行参p,q是实参a,b的拷贝。地址不一样。交换p,q并没影响a,b.就是说你把一个文件拷贝了一份,你修改拷贝的那个文件,当然不会影响原文件。


调用swap2的输出信息:

2014-05-28 14:47:06.880 SandBox[5293:403] 交换前:a的地址:0x7fff5fbff49c,b的地址:0x7fff5fbff498

2014-05-28 14:47:06.881 SandBox[5293:403] swap2 p的地址:0x7fff5fbff49c,q的地址:0x7fff5fbff498

2014-05-28 14:47:06.882 SandBox[5293:403] 交换后 a的地址:0x7fff5fbff49c,b的地址:0x7fff5fbff498

2014-05-28 14:47:06.882 SandBox[5293:403] a=2,b=1

swap2中采用的是指针传递。

p指向的地址中的值(就是a)与q指向的地址中的值(b)交换。因此可以交换成功。


调用swap3的输出信息:

2014-05-28 14:51:22.126 SandBox[5329:403] 交换前:a的地址:0x7fff5fbff49c,b的地址:0x7fff5fbff498

2014-05-28 14:51:22.127 SandBox[5329:403] swap3 p的地址:0x7fff5fbff49c,q的地址:0x7fff5fbff498

2014-05-28 14:51:22.128 SandBox[5329:403] swap3 p的地址:0x7fff5fbff498,q的地址:0x7fff5fbff49c

2014-05-28 14:51:22.128 SandBox[5329:403] 交换后 a的地址:0x7fff5fbff49c,b的地址:0x7fff5fbff498

2014-05-28 14:51:22.128 SandBox[5329:403] a=1,b=2

形参p和q会保存在栈中,p指向a的地址,q指向b的地址,使用temp指针完成了p和q的地址交换,即p指向b的地址,q指向了a的地址,但a和b地址中的值并未发生变化

还是行参并不影响实际参数。

调用swap4的输出信息:

2014-05-28 14:53:16.698 SandBox[5348:403] 交换前:a的地址:0x7fff5fbff49c,b的地址:0x7fff5fbff498

2014-05-28 14:53:16.700 SandBox[5348:403] swap4 p的地址:0x7fff5fbff49c,q的地址:0x7fff5fbff498

2014-05-28 14:53:16.700 SandBox[5348:403] 交换后 a的地址:0x7fff5fbff49c,b的地址:0x7fff5fbff498

2014-05-28 14:53:16.700 SandBox[5348:403] a=2,b=1

引用就是本身。连地址都一样。明显操作实参a,b本身.可以实现交换。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值