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; //交换指针,也只是交换p,q行参.并没有实际交换a,b实参的地址
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中,形参p和q会保存在栈中,p指向a的地址,q指向b的地址,使用temp指针完成了p和q的地址交换,即p指向b的地址,q指向了a的地址,但a和b地址中的值并未发生变化,这与swap2不同,swap2中是p指向的地址中的值(就是a)与q指向的地址中的值(b)交换,所以swap2执行完后a和b的值是交换了的。
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本身.可以实现交换。