华为软件工程师笔试题涵盖了多方面的知识点,旨在考察应聘者的编程基础、逻辑思维以及对特定技术的理解。以下是对各部分试题的详细解析:
一、判断题(20分)
1. **错误(F)**:题目中的数组inta[2][2]被初始化为两行,第一行包含{1},第二行包含{2,3}。因此,a[0][1]实际上对应于第二个元素,即数组的索引是从0开始的,所以其值应为3,而不是0。
2. **错误(F)**:int(*ptr)()是一个指向函数的指针,它并不表示一维数组的名字,而是表示一个函数指针,该函数接受无参数并返回整型。
3. **错误(F)**:指针确实可以进行比较操作,如>、<、>=、<=,但它们通常用于比较地址,而非数值。如果试图比较实际数据,必须确保指针指向的是同一类型的数据。
4. **正确(T)**:在C语言中,switch语句中的表达式c可以是多种基本数据类型,包括int、long、char、float和unsigned int。
5. **错误(F)**:宏定义`#define print(x) printf("theno, %s, is", #x)`中,`#x`会被替换为变量或表达式的文本形式,而不是其值,因此`print(5)`会输出"theno, 5, is"而不是数字5。
二、填空题(60分)
1. Windows下:
- `sizeof(str)` 表示字符串数组的大小,包括空字符,应为5("Hello"加上结束符'\0')。
- `sizeof(p)` 是指针变量的大小,通常是4或8字节,取决于平台。
- `sizeof(n)` 应为4,因为n是一个int类型的变量。
- 函数`func`中,`str`作为参数传递,不会改变其大小,故`sizeof(str)`仍为5。
2. `test`函数的结果:调用`getmemory`为`str`分配内存,并赋值为"hello",然后打印字符串,由于没有释放内存,结果将是未定义的行为,可能会导致错误输出或内存泄漏。
3. 编程题:
- 编写`strcmp`函数:要求实现不使用库函数的字符串比较,根据ASCII值逐位比较,返回0表示相等,-1表示不等。
- 编写`fun`函数:检查输入字符串是否为回文,需比较字符串的正向和反向是否相同。
三、概念理解
1. **预编译**:预编译是将频繁使用的代码片段或宏定义转化为可重用的预处理指令,提高编译效率。当代码重复使用大量相同的代码块或包含许多公共定义时,预编译头(precompiled headers)可以减少编译时间。
2. **指针类型**:`char*const p`是一个指向常量的字符指针,意味着指针所指向的字符不能被修改。`char const *p`是一个指向常量字符数组的指针,可以修改指针本身,但不能修改它指向的字符。`char const *const p`是两者结合,既不能修改指针也不能修改指向的字符。
华为的软件工程师笔试题考察了应聘者的基础语法、数据结构、指针操作、字符串处理、预编译技术以及对指针类型的深刻理解。理解和掌握这些知识点对于成功通过面试至关重要。