指针数组与数组指针
在这里数组指针是指向数组的指针, 其本质为指针, 指向的对象是数组. 由于数组的形式多样所以数组指针的表达也十分多样. 同理, 指针数组就是存放指针的数组, 其本质为数组. 由于 [ ] 的优先级高于 * 的优先级, 指针数组与数组指针的表达可做如下表示:
- int * p1 [10];//指针数组p1 先与 "[ ]" 结合构成一个包含 10 个元素的数组, int * 表示的则是数组的内容
- int (* p2)[10];//数组指针p2 先与 "*" 构成指针定义, int 表示数组内容,[10]表示数组内元素个数
由于指向数组的指针与指向普通整型变量的指针不同, 在这里可以再对数组名与 & 数组名的关系进行理解
在一维数组中, 数组名表示指向首元素的首地址, 是一个指向普通变量的指针常量, 当对其 + 1 时偏移量是一个普通数据类型的内存大小. 而在数组名前加上取地址符 & 后, 表示的就是一个指向数组的指针常量, 对其 + 1 时偏移量是一个数组的内存大小
- int p; // 这是一个普通的整型变量
- int *p; // 首先从 P 处开始, 先与 * 结合, 所以说明 P 是一个指针, 然后再与 int 结合, 说明指针所指向的内容的类型为 int 型, 所以 P 是一个返回整型数据的指针
- int p[3]; // 首先从 P 处开始, 先与 [] 结合, 说明 P 是一个数组, 然后与 int 结合, 说明数组里的元素是整型的, 所以 P 是一个由整型数据组成的数组
- int *p[3]; // 首先从 P 处开始, 先与 [] 结合, 因为其优先级比 * 高, 所以 P 是一个数组, 然后再与 * 结合, 说明数组里的元素是指针类型, 然后再与 int 结合, 说明指针所指向的内容的类型是整型的, 所以 P 是一个由返回整型数据的指针所组成的数组
- 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
附: 我的博客地址
来源: http://www.jianshu.com/p/4ab3b3e72d50