代码改变世界

数组指针的指针操作

2012-10-23 16:22  三戒1993  阅读(115)  评论(0编辑  收藏  举报

先看个例子,有如下语句:

int a[10];
int *pa = &a[0];
pa++;

首先指针pa指向a[0]的地址,注意后缀运算符的优先级高于单目运算符,所以是取a[0]的地址,而不是取a的地址。然后pa++pa指向下一个元素(也就是a[1]),由于paint *指针,一个int型元素占4个字节,所以pa++使pa所指向的地址加4,注意不是加1。

下面画图理解。从前面的例子我们发现,地址的具体数值其实无关紧要,关键是要说明地址之间的关系(a[1]位于a[0]之后4个字节处)以及指针与变量之间的关系(指针保存的是变量的地址),现在我们换一种画法,省略地址的具体数值,用方框表示存储空间,用箭头表示指针和变量之间的关系。

图 23.3. 指针与数组

指针与数组
  

  char *pA[12]={

       "1",

       "2"

       "3",

       "4",

       "5",

       "6",

       "7",

       "8",

    };

int nCountA =sizeof(pA)/sizeof(char *);/*此时结果为 12*/

  

 char p[10]={//定义了一个char类型的数组

       1,

       2,

       3,

       4,

       5,

       6,

       7,

       8,

       9,

       10

    };

   int nCount = sizeof(p)/sizeof(char);/*nCount结果为10*/

    NSLog(@"sizeof(p) ====== %s",&p[1]);

    NSLog(@"nCount ====== %d",nCount);

    

    /*pp[0]的首地址指向了p[1]的地址,所以pp[0]->p[1],pp[1]->p[2],pp[2]->p[3]*/

   char *pp = &p[1];

    

   for (int i=0; i<3; i++) {

        NSLog(@"charPointer ======= %hhd",pp[4]);

        pp +=2;/*pp的首地址向后移动两个char大小的位置,所以pp[0]->p[4],pp[1]->p[5],pp[2]->p[6]*/

    }

版权声明:本文为博主原创文章,未经博主允许不得转载。