@chenbinghua
2015-09-12T02:29:57.000000Z
字数 1266
阅读 1479
iOS面试
问打印结果是什么?
int numbers[4] = {10, 20, 30, 40};int *p = (int *)(&numbers + 1);NSLog(@"%d", *(p - 1));
数组首元素的地址数组首元素的指针数组名 + 1 的跨度:数组首元素的占用字节数上面的numbers相当于&numbers[0],等价于指向numbers[0]的指针
numbers+1相当于&numbers[1],等价于指向numbers[1]的指针
&num + 1的跨度:num的占用字节数首先搞清楚&numbers与numbers是指向不同类型的指针,虽然地址值相同,但是指针所指向类型的占用字节数不同
&numbers : 等价于指向numbers数组的指针
numbers : 相当于&numbers[0],等价于指向numbers[0]的指针
验证
NSLog(@"%p %p", numbers, numbers + 1);// 0x7fff5fbff6e0 0x7fff5fbff6e4NSLog(@"%p %p", &numbers, &numbers + 1);// 0x7fff5fbff6e0 0x7fff5fbff6f0
由打印结果看出&numbers和numbers的地址值相同,但是跨度不同,&numbers跨度是16个字节,正好是数组numbers的大小。
所以&numbers + 1地址值是40后面一个字节,把&numbers + 1强转成int类型指针,再减1就是40的地址值。
题目一:二位数组
int numbers[2][2] = {{10, 20}, // numbers[0]{11, 22} // numbers[1]};NSLog(@"%p %p", &numbers, &numbers[0] + 1);// 0x7fff5fbff6e0 0x7fff5fbff6e8 跨度8个字节NSLog(@"%p %p", &numbers, &numbers + 1);// 0x7fff5fbff6e0 0x7fff5fbff6f0 跨度16个字节
int numbers[2][2][2] = {{{10, 20},{30, 40},},{{50, 60},{70, 80}}};NSLog(@"%p %p", &numbers, &numbers + 1);// 0x7fff5fbff6d0 0x7fff5fbff6f0 跨度32个字节// 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的指针
