[关闭]
@chenbinghua 2015-09-12T10:29:57.000000Z 字数 1266 阅读 1284

一道数组和指针的面试题

iOS面试


题目

问打印结果是什么?

  1. int numbers[4] = {10, 20, 30, 40};
  2. int *p = (int *)(&numbers + 1);
  3. NSLog(@"%d", *(p - 1));

首先看下面的三个定义

1.指针p的加减法运算

2.数组名

上面的numbers相当于&numbers[0],等价于指向numbers[0]的指针
numbers+1相当于&numbers[1],等价于指向numbers[1]的指针

3.其他结论

分析

首先搞清楚&numbersnumbers是指向不同类型的指针,虽然地址值相同,但是指针所指向类型的占用字节数不同

&numbers : 等价于指向numbers数组的指针
numbers : 相当于&numbers[0],等价于指向numbers[0]的指针

验证

  1. NSLog(@"%p %p", numbers, numbers + 1);
  2. // 0x7fff5fbff6e0 0x7fff5fbff6e4
  3. NSLog(@"%p %p", &numbers, &numbers + 1);
  4. // 0x7fff5fbff6e0 0x7fff5fbff6f0

由打印结果看出&numbersnumbers的地址值相同,但是跨度不同,&numbers跨度是16个字节,正好是数组numbers的大小。
所以&numbers + 1地址值是40后面一个字节,把&numbers + 1强转成int类型指针,再减1就是40的地址值。

相关题目

题目一:二位数组

  1. int numbers[2][2] = {
  2. {10, 20}, // numbers[0]
  3. {11, 22} // numbers[1]
  4. };
  5. NSLog(@"%p %p", &numbers, &numbers[0] + 1);// 0x7fff5fbff6e0 0x7fff5fbff6e8 跨度8个字节
  6. NSLog(@"%p %p", &numbers, &numbers + 1);// 0x7fff5fbff6e0 0x7fff5fbff6f0 跨度16个字节
  1. int numbers[2][2][2] = {
  2. {
  3. {10, 20},
  4. {30, 40},
  5. },
  6. {
  7. {50, 60},
  8. {70, 80}
  9. }
  10. };
  11. NSLog(@"%p %p", &numbers, &numbers + 1);
  12. // 0x7fff5fbff6d0 0x7fff5fbff6f0 跨度32个字节
  13. // numbers[0][0] == &numbers[0][0][0],相当于是一个指向numbers[0][0][0]的指针
  14. // numbers[1] == &numbers[1][0],相当于是一个指向numbers[1][0]的指针
  15. // numbers == &numbers[0],相当于是一个指向numbers[0]的指针
  16. // &numbers == 相当于是一个指向numbers的指针
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注