华为面试题解析:预编译与指针常量

需积分: 9 9 下载量 148 浏览量 更新于2024-07-19 1 收藏 63KB DOCX 举报
"这篇资料主要汇总了华为面试中的一些常见问题,包括了预编译的概念与应用场景,以及C++中不同类型的指针和字符串常量的比较与使用注意事项。此外,还提到了sizeof运算符在处理数组时的局限性。" 在华为的面试准备中,了解基本的编程概念和技术是非常重要的。预编译是一个关键步骤,它通常在编译程序之前进行,用于提高编译效率。预编译指令(如`#include`,`#define`等)会被处理,但不会真正执行,这有助于减少编译时间。当处理大型代码库或多个模块共享相同头文件时,预编译特别有用。例如,预编译头文件可以存储常见的包含文件,以便在编译每个模块时只需处理一次。 接下来,涉及了C++中的指针常量和常量指针的区别。`char*const p`表示指针`p`是一个常量,其地址不可变,但所指的`char`值可变。而`char const* p`和`const char* p`都是指针指向常量,意味着不能通过指针改变所指的`char`值,但指针本身可以改变。这种差异在多态编程和内存管理中至关重要。 关于字符串的比较,`str1`、`str2`、`str3`和`str4`是数组,它们在内存中有各自独立的存储空间,因此`str1==str2`和`str3==str4`的结果均为0,表示它们不相等。而`str5`、`str6`、`str7`和`str8`则是指向常量字符串的指针,它们都指向内存中的同一区域,因此`str5==str6`和`str7==str8`的结果为1,表示它们相等。 最后,代码示例中,`UpperCase`函数内的`sizeof(str)`除以`sizeof(str[0])`来获取数组长度的方法在处理动态数组或外部数组时可能会出现问题。这是因为`sizeof`在函数内部对于动态数组(如通过`malloc`分配的内存)或函数参数(如这里的`str`)只能返回指针的大小,而不是实际数组的长度。所以,这个方法在处理非静态数组时可能会导致计算错误。在实际编程中,如果不确定数组的长度,可以考虑传递数组长度作为额外参数,或者使用C++标准库中的容器如`std::vector`来避免此类问题。