指针数组
与数组指针
在这里数组指针
是指向数组的指针
,其本质为指针
,指向的对象是数组
。因为数组的形式多样因此数组指针的表达也十分多样。同理,指针数组
就是存放指针的数组
,其本质为数组
。因为[ ]
的优先级高于*
的优先级,指针数组
与数组指针
的表达可作以下表示:int * p1 [10]; // 指针数组 p1先与“[ ]”结合构成一个包含10个元素的数组,int*表示的则是数组的内容
int (* p2)[10]; // 数组指针 p2先与“ * ”构成指针定义,int表示数组内容,[10]表示数组内元素个数
复制代码
因为指向数组的指针
与指向普通整型变量的指针
不一样,在这里能够再对数组名
与&数组名
的关系进行理解 在一维数组中,数组名
表示指向首元素的首地址
,是一个指向普通变量的指针常量
,当对其+1时偏移量是一个普通数据类型的内存大小
。而在数组名前加上取地址符&后
,表示的就是一个指向数组的指针常量
,对其+1时偏移量是一个数组的内存大小
git
int p;
//这是一个普通的整型变量
github
int *p;
//首先从P
处开始,先与*
结合,因此说明P
是一个指针
,而后再与int
结合,说明指针所指向的内容的类型为int型
,因此P
是一个返回整型数据的指针
数组
int p[3];
//首先从P
处开始,先与[]
结合,说明P
是一个数组
,而后与int
结合,说明数组里的元素是整型的
,因此P
是一个由整型数据组成的数组
bash
int *p[3];
//首先从P
处开始,先与[]
结合,由于其优先级比*
高,因此P
是一个数组
,而后再与*
结合,说明数组里的元素是指针类型
,而后再与int
结合,说明指针所指向的内容的类型是整型的
,因此P
是一个由返回整型数据的指针所组成的数组
spa
int (*p)[3];
//首先从P
处开始,先与*
结合,说明P
是一个指针
,而后再与[]
结合,说明指针所指向的内容是一个数组
,而后再与int
结合,说明数组里的元素是整型的
,因此P
是一个指向由整型数据组成的数组的指针
指针
int arrayName[4] = {10, 20, 30, 40};
int *p = (int *)(&arrayName + 1);
NSLog(@"%d", *(p - 1));
复制代码
(&arrayName + 1)
:&arrayName
是数组的地址(等价于指向arrayName数组的指针
)- 增长
1
会日后移动16个字节
,开始是4个字节的位置
,移动后就是16个字节后面的位置
(也就是目前位置是20个字节
)- 最后又赋值给
int类型
的指针p
(int类型占4个字节
)- 因此
(p - 1)
就是减去4个字节
,变成为16个字节的位置
,输出的*(p - 1)
值为40
附:个人博客地址code