"华为软件工程师笔试题"
华为软件工程师的笔试环节是对候选人的技术能力进行评估的重要阶段。这些题目涵盖了编程基础知识,包括数组、指针、数据类型、内存管理、预编译指令以及字符串处理等方面。以下是根据题目内容解析的一些关键知识点:
1. **判断题解析**
- 题目1:在C语言中,数组定义inta[2][2]={{1},{2,3}};意味着a[0][1]没有显式赋值,但根据规则,未指定的元素会默认初始化为0,所以a[0][1]的值确实为0。
- 题目2:ptr是一个指向函数的指针,而不是一维数组的名字。声明`int(*ptr)()`表示ptr是一个可以调用并返回整型值的函数指针。
- 题目3:指针可以进行比较操作,但必须是指向同一类型的数据,否则可能会导致未定义行为。
- 题目4:switch语句中的c不能是float类型,因为浮点数的比较在C语言中不被switch语句支持。
- 题目5:宏#define定义的print(x)实际上是将"x"转换为字符串并打印,题目中的写法是正确的。
2. **填空题解析**
- 在Windows环境下,str是一个字符数组,其大小包括字符串结束符'\0',所以sizeof(str)为6。p是一个指向char的指针,其大小是4字节。n是一个int,大小也是4字节。在函数func内部,str是一个函数参数,被当作指针处理,因此sizeof(str)是4字节。test函数中,getmemory函数分配了100字节的内存,然后复制了"hello"到这块内存,最后打印出"hello"。
- test函数运行后,str指向的内存区域已分配并填充了"hello",所以调用printf(str)会打印"hello"。
- ptr最初指向数组arr的第一个元素,增加123后,ptr仍然指向数组,但由于整数加法,打印的结果是8,再次自增后的ptr指向数组的第二个元素,打印的值仍然是8。
3. **编程题解析**
- 第一小题是要实现一个不依赖库函数的strcmp,这需要理解字符串比较的基本逻辑,逐个比较字符直到找到不同或遇到'\0'。
- 第二小题要求编写一个函数判断字符串是否为回文,回文字符串正读和反读都一样。可以通过双指针从两端向中间比较或者翻转字符串后与原字符串比较来实现。
4. **额外知识点**
- 预编译:预编译是在实际编译之前进行的步骤,主要用于处理#include指令,宏替换和条件编译指令。当代码包含大量不变的宏定义或头文件时,预编译可以提高编译效率。
- char*constp, char const*p, const char*p 的区别在于指针的const性:
- char*constp:指针本身是常量,不能改变,但指向的字符可以修改。
- char const*p:指针可以改变,但所指的字符不可修改。
- const char*p:同样,指针可以改变,但所指的字符不可修改,这与上一个的区别在于const的位置,但意义相同。
了解并熟练掌握这些知识点对于准备华为软件工程师的笔试至关重要,它们反映了基础的编程概念和C语言特性。