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语言中处理指针所需要了解的主要概念。