@chenbinghua
2015-09-12T10:29:57.000000Z
字数 1266
阅读 1284
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 0x7fff5fbff6e4
NSLog(@"%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的指针