指针的作用不言而喻,它可以帮助你高效地操作data structure,改变方法中的参数,精确地处理数组等等。
先看个指针操作int的栗子:
int count = 10, x;
int *intPtr = &count;
x = *intPtr;
再看个指针操作char的,可以看出pass by reference的高效性:
char cc = 'a';
char *toCC = &cc;
NSLog(@"cc=%c, toCC=%c", cc, *toCC);
cc = 'b';
NSLog(@"cc=%c, toCC=%c", cc, *toCC);
cc = 'c';
NSLog(@"cc=%c, toCC=%c", cc, *toCC);
then,看下指针操作structure的:
typedef struct personInfo {
char *name;
int age;
bool isStudent;
}ken, pucks, clip;
personInfo *toPerson = &ken;
toPerson->name = "ken";
toPerson->age = "32";
toPerson->isStudent = 0;
pass by reference的数据交换的例子:
void swap(int *m, int *n) {
int tmp;
tmp = *m;
*m = *n;
*n = tmp;
}
int a = -3, b=2;
NSLog(@"a=%i, b=%i", a, b);
swap(&a, &b);
NSLog(@"a=%i, b=%i", a, b);
指针操作字符串的栗子
void copyString(char *dist, char *src) {
for(; *src!='\0'; ) {
*dist++ = *src++;
}
*dist = '\0';
}
//和copyString等效的使用字符串:
void copyStringByArray(char *dist, char src[]) {
for(size_t i=0; src[i]!='\0';) {
*(dist++) = src[i++];
}
dist[i] = '\0';
}
anyway,补充一下,c++引入了引用类型。可以说引用是对pointer的一种优化,所以提倡能用引用的地方尽量使用引用~
事实上,数组名和指针在编译器看来是一回事,数组名做方法参数的时候是按着指针传递的。任何的数组名都有它的指针表示。现在看个二维数组的指针表示:
int headIndex[2][5] = {{0, 1, 2, 3, 4}, {5, 6, 7, 8, 9}};
for(size_t i=0; i<2; ++i) {
for(size_t j=0; j<5; ++j) {
NSLog(@"%i", headIndex[i][j]);
NSLog(@"%i", *(headIndex[i]+j));
NSLog(@"%i", (*(headIndex+i))[j]);
NSLog(@"%i", *(*(headIndex+i)+j);
NSLog(@"%i", &headIndex[0][0]+5*i+j);//把二维数组转换成了一个线性的一维数组操作
}
}