先看个例子,有如下语句:
int a[10]; int *pa = &a[0]; pa++;
首先指针pa
指向a[0]
的地址,注意后缀运算符的优先级高于单目运算符,所以是取a[0]
的地址,而不是取a
的地址。然后pa++
让pa
指向下一个元素(也就是a[1]
),由于pa
是int *
指针,一个int
型元素占4个字节,所以pa++
使pa
所指向的地址加4,注意不是加1。
下面画图理解。从前面的例子我们发现,地址的具体数值其实无关紧要,关键是要说明地址之间的关系(a[1]
位于a[0]
之后4个字节处)以及指针与变量之间的关系(指针保存的是变量的地址),现在我们换一种画法,省略地址的具体数值,用方框表示存储空间,用箭头表示指针和变量之间的关系。
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]*/
}