13.4.2 指针、方法和函数
可以按一般方式将指针作为参数传递给方法或函数,并且可以让函数或者方法返回指针。alloc和init方法一直都在这么做,也就是返回指针。本章结尾对此有更详细的介绍。
现在考虑代码清单13-11。
代码清单13-11
//Pointers as arguments to functions
import<Foundation/Foundation.h>
void exchange(intpint1,intpint2)
{
int temp;
temp=*pint1;
pint1=pint2;
*pint2=temp;
}
int main(int argc, char*argv[])
{
NSAutoreleasePool*pool=[[NSAutoreleasePool alloc]init];
void exchange(intpint1,intpint2);
int i1=-5,i2=66,p1=&i1,p2=&i2;
NSLog(@“i1=%i, i2=%i”,i1,i2);
exchange(p1,p2);
NSLog(@“i1=%i, i2=%i”,i1,i2);
exchange(&i1,&i2);
NSLog(@“i1=%i, i2=%i”,i1,i2);
[pool drain];
return 0;
}
代码清单13-11输出
i1=-5,i2=66
i1=66,i2=-5
i1=-5,i2=66
函数exchange的目的是交换由两个参数指向的两个整型值。局部整型变量temp用于在交换时存放其中一个整数的值。它的值设为等于pint1指向的整型值。然后,pint2指向的整数被复制到pint1指向的整数中,最后temp的数值被复制到pint2指向的整数中,这样就完成了交换。
main例程定义了整数i1和i2,并给它们分别赋值-5和66。然后,定义了两个整型指针p1和p2,并分别将其设为指向i1和i2。然后这个程序显示i1和i2的值,并且传递两个指针(p1和p2)作为参数来调用函数exchange。函数exchange交换p1指向的整数值和p2指向的整数值。因为p1指向i1,p2指向i2,所以函数交换的是i1和i2的值。第二个NSLog调用的输出验证交换函数运行良好。
第二次调用exchange函数比较有意思。这次,传递给该函数的参数是通过对i1和i2应用地址运算符手动创建的指针。因为表达式&i1产生了指向整型变量i1的指针,所以它符合函数所期望的第一个参数类型(整型指针)。这同样适用于第二个参数。从程序的输出结果中可以看出,函数exchange完成了这项任务,将i1和i2的数值交换回它们原本的值。
详细研究代码清单13-11。它使用一个小例子阐明了Objective-C语言中处理指针所需要了解的主要概念。