华为软件工程师笔试题涵盖了多个知识点,旨在考察应聘者的编程基础、数据结构理解、内存管理以及语言特性掌握。以下是详细解析:
1. 判断题部分(20分)
- 问题1:错误。`inta[2][2]={{1},{2,3}}`中的数组定义,第二行只有一个元素,所以`a[0][1]`实际上是未初始化的,其值不确定,题目说法错误。
- 问题2:错误。`int(*ptr)()`定义了一个函数指针,它指向一个返回整型并接受无参数的函数,而不是一维数组。
- 问题3:错误。指针可以进行算术运算,如自增(++)、自减(--),以及比较运算(==、!=),但不能直接与数字进行>、<等比较,除非用指针加上或减去某个偏移量后才能用于比较。
- 问题4:正确。`switch(c)`语句中的`c`确实可以是多种基本数据类型,包括`int`, `long`, `char`, `float`, 和 `unsigned int`。
- 问题5:`#define print(x)` 是宏定义,它不是一个函数,`#x` 在宏展开时会替换为 `x` 的类型名,而不是变量值。
2. 填空题部分(60分)
- 在Windows下:
- `sizeof(str)` 表示字符串数组占用的内存大小,包括null终止符,这里是5 * sizeof(char) = 10(因为字符串"Hello"长度为5,加上终止符)。
- `sizeof(p)` 表示指针变量本身的存储空间,通常为4或8字节(取决于系统架构)。
- `sizeof(n)` 为整型变量 `n` 的大小,通常也是4或8字节。
- 函数 `func` 内部,`str` 作为参数传递,`sizeof(str)` 在函数内仍为100,但函数调用后实际传入的是地址,不会改变原数组大小。
- `setmemory` 函数分配了 `num` 字节的内存给 `str`,然后将其赋值为 "hello",`printf(str)` 会打印 "hello"。因此,运行结果是 "hello"。
3. 编程题(50分)
- 第一小题 `strcmp` 函数:要求不使用库函数实现字符串比较。该函数通过逐个字符比较源字符串和目标字符串,遇到不同字符返回对应差值(ASCII码),最后比较结束时返回0表示相等,-1表示不等。
- 第二小题 `fun` 函数:判断一个字符串是否为回文。这个函数需要遍历字符串,同时检查首尾字符是否相同,逐次向中间移动,直到到达字符串中心或找到不匹配的字符,返回相应的标志。
4. 预编译和指针类型的区别:
- 预编译是编译器在正式编译前对程序中的特定部分进行处理的过程,如宏定义和条件编译。通常用于优化代码、减少重复和提高编译效率。
- `char*const p` 是常量指针,指针本身不可变,但指向的内容可以改变。
- `char const* p` 是指向常量的指针,指针指向的字符串内容不可修改,但指针本身可以改变。
- `char const* const p` 是双重常量指针,指针本身和指向的内容均不可修改。
通过这些题目,华为软件工程师笔试旨在考察应聘者的基础编程能力、数据结构理解、内存管理和C语言高级特性。在准备面试时,应着重复习相关知识点,包括指针运算、数据类型、字符串处理和预编译宏的使用。