华为嵌入式面试解析:预编译与指针常量

需积分: 50 1 下载量 54 浏览量 更新于2024-07-20 1 收藏 106KB DOC 举报
"这篇内容包含了华为公司在嵌入式领域的面试题目,主要涉及C语言的基础概念,包括预编译、指针常量与常量指针的差异、字符串数组的比较以及sizeof运算符的使用场景。" 在华为的嵌入式面试中,可能会遇到一些基础但又关键的问题,这些问题旨在考察候选人的编程功底和对C语言核心概念的理解。 首先,预编译(Preprocessing)是C/C++编译过程的第一步,主要处理以`#`开头的预处理器指令,如`#include`、`#define`等。预编译通常在源代码编译之前进行,目的是减少编译时间。当源代码包含大量不变的头文件或者使用了相同的编译选项时,预编译可以显著提高效率,因为它避免了重复编译这些不变的部分。 其次,关于指针常量和常量指针的区分: 1. `char*const p` 表示常量指针,意味着指针p的值(即它所指向的地址)不可改变,但p可以指向的字符是可以修改的。 2. `char const* p` 和 `const char*p` 意味着指向常量的指针,即指针p所指向的字符是不可修改的,但p自身可以指向其他位置。 3. `const char*const p` 表示常量指针指向常量,即指针p的值和它所指向的字符都不能修改。 再来看字符串数组和指针的比较。在C语言中,字符串实际上是以空字符`\0`结尾的字符数组。例如: - `char str1[]="abc"` 和 `char str2[]="abc"` 是字符数组,它们在内存中各自分配空间,即使内容相同,它们的地址也是不同的,所以比较结果为0。 - `const char str3[]="abc"` 和 `const char str4[]="abc"` 同样是字符数组,具有相同的性质。 - `const char*str5="abc"` 和 `const char*str6="abc"` 是指向常量字符串的指针,它们都指向同一个存储在只读内存区域的字符串,所以比较结果为1。 - `char*str7="abc"` 和 `char*str8="abc"` 是非const的字符指针,同样指向只读内存区域的同一字符串,比较结果也为1。 最后,关于sizeof运算符的使用。在C语言中,`sizeof`可以返回表达式或类型所占用的字节数。在函数`UpperCase`内部,`sizeof(str)`返回的是指针的大小,因为在这里`str`被当作一个指针传递,而不是一个数组。因此,它不能正确地获取数组的实际长度。而在函数外部,由于`str`是静态定义的数组,`sizeof(str)`则能正确返回数组的总大小,包括结束的`\0`字符。 理解这些基本概念对于在华为的嵌入式面试中脱颖而出至关重要,它们体现了对C语言底层机制的深刻掌握,而这在嵌入式开发中是不可或缺的。