京东面试题
1、请写出以下代码输出
1
2
3
4
5
|
int
a
[
5
]
=
{
1
,
2
,
3
,
4
,
5
}
;
int
*ptr
=
(
int
*
)
(
&
a
+
1
)
;
printf
(
"%d, %d"
,
*
(
a
+
1
)
,
*
(
ptr
+
1
)
)
;
|
参考答案: 2, 随机值
这种类型题好像挺常见的。考的就是C语言上的指针的理解和数组的理解。
分析:
a代表有5个元素的数组的首地址,a[5]的元素分别是1,2,3,4,5。接下来,a + 1表示数据首地址加1,那么就是a[1],也就是对应于值为2.但是,这里是&a + 1,因为a代表的是整个数组,它的空间大小为5 * sizeof(int),因此&a + 1就是a+5。a是个常量指针,指向当前数组的首地址,指针+1就是移动sizeof(int)个字节。
因此,ptr是指向int *类型的指针,而ptr指向的就是a + 5,那么ptr + 1也相当于a + 6,所以最后的*(ptr + 1)就是一个随机值了。而*(ptr – 1)就相当于a + 4,对应的值就是5。
2、写一个标准宏Max,并给出以下代码的输出
1
2
3
4
5
6
|
int
array
[
5
]
=
{
1
,
2
,
3
,
4
,
5
}
;
int
*p
=
&
array
[
0
]
;
int
max
=
Max
(
*p
++
,
1
)
;
printf
(
"%d %d"
,
max
,
*p
)
;
|
参考答案: 1,2
1
2
3
|
#define Max(X, Y) ((X) > (Y) ? (X) : (Y))
|
当看到宏时,就会想到宏定义所带来的副作用。对于++、–,在宏当中使用是最容易产生副作用的,因此要慎用。
分析:
p指针指向了数组array的首地址,也就是第一个元素对应的地址,其值为1.
宏定义时一定要注意每个地方要加上圆括号
*p++相当于*p, p++,所以Max(*p++, 1)相当于:
1
2
3
4
5
6
7
8
9
10
11
|
(
*p
++
)
>
(
1
)
?
(
*p
++
)
:
(
1
)
=
>
(
1
)
>
(
1
)
?
(
*p
++
)
:
(
1
)
=
>
第一个
*p
++的结果是,
p所指向的值变成了
2,但是
1
>
1为値,所以最终
max的值就是
1。而后面的
(
*p
++
)也就不会执行,因此
p所指向的地址对应的值就是
2,而不是
3.
|
扩展:如果上面的*p++改成*(++p)如何?
分析:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
(
*
++
p
)
>
(
1
)
?
(
*
++
p
)
:
(
1
)
=
>
(
2
)
>
(
1
)
?
(
*
++
p
)
:
(
1
)
=
>
max
=
*
++
p
;
=
>
*p
=
3,
max
=
3
;
|
3、在一个对象的方法里:self.name=@object
;和name=@object
有什么不同
参考答案:
这是老生常谈的话题了,实质上就是问setter方法赋值与成员变量赋值有什么不同。通过点语法self.name实质上就是[self setName:@object
];。而name这里是成员变量,直接赋值。
一般来说,在对象的方法里成员变量和方法都是可以访问的,我们通常会重写Setter方法来执行某些额外的工作。比如说,外部传一个模型过来,那么我会直接重写Setter方法,当模型传过来时,也就是意味着数据发生了变化,那么视图也需要更新显示,则在赋值新模型的同时也去刷新UI。这样也不用再额外提供其他方法了。
4、怎样使用performSelector传入3个以上参数,其中一个为结构体
参考答案:
1
2
3
4
5
|