360校园招聘2015届笔试题部分解析

开始

大约花了两天做了一套360公司的2015年技术类校园招聘的笔试题,感觉非常基础,但有难度。下面对里面有意思的部分解析一下:

一组容易混淆的代码

1
2
3
4
char a;
int *ptr=(int*)(&a+1);
int *ptr=(int*)(&a)+1;
int *ptr=(int*)((int)a+1);

第一句是将a的地址往后偏移一个单位。注意,这里的一个单位是sizeof(a的数据类型),然后再将这个地址转化为int类型的指针地址传给ptr变量。ptr作为指针变量就指向这个地址。
第二句是先将a的地址转化为int类型的指针数组,然后加一个单位,这个单位是内存地址最小的寻址单位,为4个字节。
第三句是将a转化为整形,例如99,然后加1,变为100,然后转化为int类型的指针变量传给ptr,此致指针ptr指向内存地址为100的位置,而里面的内容不确定,不可预知。

构造函数和析构函数

看下面一段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include<string.h>
using namespace std;
class MyClass
{
public:
MyClass(int i = 0)
{
cout<<i<<endl;
}
MyClass(const MyClass &x)
{
cout<<2<<endl;
}
MyClass &operator=(const MyClass &x)
{
cout<<4<<endl;
return *this;
}
~MyClass()
{
cout<<5<<endl;
}
};

int main()
{
char b[10]="Hello!";
MyClass obj1(1),obj2(3);
MyClass obj3;
obj3=obj1;
MyClass obj4=obj1;
cout<<b<<endl;
return 0;
}

上面第一个函数是构造函数,无参数时,默认i=0。
第二个函数是类型赋值构造,只能应用在类生成的时候。
第三个函数是等号重载,重新定义了等号。
第四个是析构函数。
主函数中先生成obj1和obj2,分别调用了上面的第一个构造函数,此时打印1和3。
然后生成obj3,此时调用第一个构造函数,并使用默认参数,此时打印0。
然后把obj1赋值给obj3,调用第三个函数,此时打印4。
然后生成obj4,是直接赋值构造的,调用第二个函数,此时打印2。
return之后,最后四次调用析构函数,打印5555。
值得注意的是,构造函数和析构函数的运行顺序是相反的,也就是最先构造的最后析构。
最后运行结果为:
1

关于字符数组的赋值

看下面两道题:

1.不能把字符串Hello!赋给数组b的语句是()
A. char b[10]={‘H’ , ‘e’ , ‘l’ , ‘l’ , ‘o’ , ‘!’};
B. char b[10];b=”Hello!”;
C. char b[10];strcpy(b,”Hello!”);
D. char b[10]=”Hello!”;

2.以下不能正确进行字符串赋初值的语句是()
A. char str[5]=”good!”;
B.char str[]=”good!”;
C.char *str=”good!”;
D.char str[5]={‘g’, ‘o’, ‘o’, ‘d’};

第一题选B,理由: b是地址常量,只能指向本身的内存空间,不可以指向字符串常量”Hello!”的首地址。
第二题选A,理由: 字符串是以’\0’结束的, 所以加上”good!”就是6个字节, 而数组的大小才是5,所以空间不够, 大小至少为6, 改为 char str[6]=”good!”;或者char str[]=”good!”;都可以,后者根据字符串的字符个数自动匹配数组大小。
关于字符数组的赋值问题,把握一条原则,首先数组名本身就是个指针,指向了数组的第一个元素的地址。另外数组名是个指针常量,或者叫地址常量,也就是当定义一个数组时, 数组名就指向了本身的地址空间, 是个常量, 不可以再指向别的地址。第一题中的B选项就是把字符串的指针赋值给了这个数组名指针常量,是错误的。

总结

把这套试题完完整整的做了一遍,收获还是挺大的,发现自己基础非常不牢固,还有很大的提高空间,和这类大公司的要求还有一段距离。接下来,好好学习巩固基础的C、C++、Java等语言概念,TCP/IP、操作系统、数据结构与算法以及信安专业课。


【版权声明】
本文首发于戚名钰的博客,欢迎转载,但是必须保留本文的署名戚名钰(包含链接)。如您有任何商业合作或者授权方面的协商,请给我留言:qimingyu.security@foxmail.com
欢迎关注我的微信公众号:科技锐新

kejiruixin

本文永久链接:http://qimingyu.github.io/2016/03/21/360校园招聘2015届笔试题部分解析/

坚持原创技术分享,您的支持将鼓励我继续创作!

热评文章