华为嵌入式软件笔试指南:预编译与指针详解

5星 · 超过95%的资源 需积分: 34 56 下载量 83 浏览量 更新于2024-07-25 1 收藏 170KB PDF 举报
"这篇内容是关于华为嵌入式软件岗位的笔试题目,涵盖了预编译、指针常量、字符串数组以及sizeof运算符在数组处理中的应用等知识点。" 在嵌入式软件开发中,理解和掌握这些基础知识至关重要。首先,我们来详细探讨预编译的概念。预编译是在正式编译之前进行的一种处理步骤,它的主要作用是对源代码中的宏定义、条件编译指令等内容进行替换。当项目中存在大量共享的头文件,或者编译选项固定时,预编译可以帮助提高编译效率,因为预编译后的结果可以被多次使用,减少了重复编译的工作。 接下来,我们看看指针常量的区别。在C++中,`char*const p` 表示指针p本身是常量,即不能改变p指向的地址,但可以修改p所指向的值;`char const *p` 意味着p指向的内容是常量,不能修改p所指向的字符,但p可以改变指向其他地址;而`const char* const p` 则意味着两者都是常量,即p的值和它所指向的字符都不能改变。 再来看数组和指针的比较。在C++中,数组名实际上是一个指向其首元素的指针。例如,`str1` 和 `str2` 是字符数组,它们在内存中拥有独立的存储空间。因此,即使是内容相同的数组,如 `str1` 和 `str2`,它们的地址也是不同的,所以 `(str1 == str2)` 的结果是 `0`。而 `str3` 和 `str4` 以及 `str5` 和 `str6` 是常量字符数组和常量字符指针,它们都指向同一块内存区域,因此 `(str3 == str4)` 和 `(str5 == str6)` 都是 `1`。至于 `str7` 和 `str8`,它们是可变字符指针,可以指向不同的地址,所以在赋值后,它们可能指向不同的字符串,即使初始时它们都指向了相同的字符串常量。 最后,关于 sizeof 运算符的问题。在C++中,sizeof 在函数外部可以正确计算静态数组的大小,比如 `str` 在这里是一个静态定义的数组,它的大小是6,包括结束符`\0`。然而,在函数内部,当传递数组作为参数时,数组会退化为指针,因此 `sizeof(str)` 只能得到指针的大小,而不是整个数组的大小。这会导致在计算数组长度时出现问题,尤其是在涉及到字符串处理的函数中,如题目中的 `UpperCase` 函数。正确的做法是将数组的大小作为参数传递,或者使用 C++11 引入的 `std::string` 类型来避免这种问题。 华为嵌入式软件笔试题目的这些内容涉及了编程语言的基础知识,包括预编译、指针常量的性质、数组和指针的区别以及 sizeof 运算符的应用,这些都是开发者必须熟练掌握的技能。对于准备华为嵌入式软件岗位面试的求职者来说,理解并能灵活运用这些知识是非常关键的。