pointer浅谈

指针的作用不言而喻,它可以帮助你高效地操作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);//把二维数组转换成了一个线性的一维数组操作
  }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值