指针经典题
思考:以下小程序,输出结果是多少?
int numbers[4] = {10, 20, 30, 40, 50};
int *p = (int *)(&numbers + 1);
NSLog(@"%d", *(p - 1));
思路分析
首先分析一维数组
int numbers[4] = {10, 20, 30, 40};
NSLog(@"%p %p", numbers, numbers + 1);
NSLog(@"%p %p", &numbers, &numbers + 1);
- numbers : 存储的是
数组首元素
的地址,相当于&numbers[0]
,等价于指向numbers[0]的指针
,所以numbers + 1的跨度是整型数据10所占用的字节数;
- &numbers : 等价于指向numbers数组的指针,所以&numbers + 1的跨度是整个数组numbers所占用的字节数;
其次分析二维数组
int numbers[2][2] = {
{10, 20}, // numbers[0]
{11, 22} // numbers[1]
};
- numbers[0] == &numbers[0][0],相当于一个指向numbers[0][0]的指针;
- numbers == &numbers[0],相当于一个指向numbers[0]的指针
- &numbers == 相当于一个指向numbers的指针
最后分析三维数组
int numbers[2][2][2] = {
{
{10, 11},
{12, 13}
},
{
{14, 15},
{16, 17}
}
};
- numbers[0][0] == &numbers[0][0][0],相当于是一个指向numbers[0][0][0]的指针
- numbers[1] == &numbers[1][0],相当于是一个指向numbers[1][0]的指针
- numbers == &numbers[0],相当于是一个指向numbers[0]的指针
- &numbers == 相当于是一个指向numbers的指针
解答
int numbers[4] = {10, 20, 30, 40, 50};
int *p = (int *)(&numbers + 1);
NSLog(@"%d", *(p - 1));
- &numbers == 相当于是一个指向numbers的指针的指针,&numbers + 1的跨度为整个数组numbers的字节,(&numbers + 1)指向了数组的末尾
-
(int *)(&numbers + 1)
将指向整个数组的指针强转为指针整型的指针,它的跨度为int类型的字节
-
(p - 1)
是指向了数据最后一个数据的指针,*p
取得得数据是50;
结论
指针p的加减法运算
- 指针p + N
- p里面存储的地址值 + N * 指针所指向类型的占用字节数
- 指针p - N
- p里面存储的地址值 - N * 指针所指向类型的占用字节数
数组名
- 存储的是
数组首元素
的地址
- 等价于:一个指向
数组首元素
的指针
-
数组名 + 1
的跨度:数组首元素
的占用字节数
其他结论
网友评论