"华为面试真题集包含了2013年至2015年华为公司对嵌入式软件工程师的面试问题,其中包含了答案。这份资料来自UTips校招平台,旨在帮助求职者准备华为公司的面试,提供关于预编译、指针类型、sizeof运算符在处理数组时的应用以及32位机器上的指针大小等相关知识点的实践题目。"
在华为的面试真题中,涉及了以下几个重要的嵌入式软件开发知识点:
1. **预编译**:
预编译是在实际编译之前进行的一个步骤,主要处理宏定义、条件编译指令等。当代码包含大量的头文件且这些文件不经常改变,或者多个模块共用相同的编译选项和头文件时,预编译可以提高编译效率,生成预编译头文件。
2. **指针类型的区别**:
- `char*const p`:常量指针,指针变量p的值不可修改,但可以通过p修改它所指向的char型变量。
- `char const* p`:指向常量的指针,p指向的内容不可修改,但指针p本身可变,可以指向其他位置。
- `const char* p`:与`char const* p`相同,表示p指向的内容是常量,不能修改。
3. **sizeof运算符的使用**:
sizeof运算符可以用来获取变量或数据类型的大小。在函数外部,对于静态数组,sizeof能正确返回数组的总字节数。但在函数内部,如果传递的是数组的首地址(例如,`char str[]`),sizeof会返回指针的大小,因为此时数组信息丢失,仅剩指针本身。因此,在函数UpperCase中,sizeof(str)将返回指针的大小,而非字符串的实际长度。
4. **32位机器的指针大小**:
在32位系统中,数据总线宽度为32位,这意味着地址总线也是32位,因此一个指针占用4个字节,即32位。
5. **数组和指针操作**:
代码中的`inta[5]`定义了一个整型数组,`*(a+1)`访问数组第二个元素,即`a[1]`,值为2。`int*ptr=(int*)(&a+1)`创建了一个指针,它指向`a`数组之后的位置,即下一个内存单元。`*(ptr-1)`访问的是`ptr`指针前一个位置的元素,即`a[4]`,在给定的数组中,这将导致越界访问,因为在C/C++中,数组下标从0开始,所以`a[5]`是无效的。不过,由于题目没有提供完整的运行环境,我们无法确定实际输出,但可以推测可能会输出数组的最后一个元素,即5。
这些面试问题涵盖了C/C++编程基础、指针操作和数组理解,这些都是嵌入式软件工程师需要掌握的核心技能。准备面试时,不仅要理解这些概念,还需要熟悉如何在实际编程场景中应用它们。