2022年面试题嵌入式软件开发.docx
精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆1. 什么是预编译,何时需要预编译:答案:、总是使用不常常改动的大型代码体;好工程的回答,不是么:) 、程序由多个模块组成,全部模块都使用一组标准的包含文件和相同的编译选项;在这种情形下,可以将全部包含文件预编译为一个预编译头;2. char * const p char const * p const char *p 上述三个有什么区分?答案:char * const p; /常量指针, const 修饰的是指针p,故 p 的值不行以修改const char *p ; /和 char const char const * p;/const 修饰的是 *p,为指向常量的指针,指向的常量值不行以改*p 3. 数组变量和指针的区分?cpp view plaincopy1. #include <iostream>2. using namespace std; 3.4.int mainint argc, charconst *argv 5. char str1 = "abc" 6.7.char str2 = "abc" 8.constchar str3 = "abc" 9.constchar str4 = "abc" 10.constchar *str5 = "abc" 11.constchar *str6 = "abc" 12.char *str7 = "abc" ; 13.char *str8 = "abc" ; 14.15. cout << str1 = str2 << endl; 16. cout << str3 = str4 << endl; 17. cout << str5 = str6 << endl; 18. cout << str7 = str8 << endl; 19.20.return 0; 是数组变量,它们有各自的内存空间;而str5,str6,str7,str821. 结果是: 0 0 1 1 str1,str2,str3,str4是指针,它们指向相同的常量区域;名师归纳总结 - - - - - - -第 1 页,共 4 页精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆4. 以下代码中的两个 sizeof 用法有问题吗?答案是有问题的,只要长度超过指针的长度就不行以了cpp view plaincopy1. #include <iostream>2. using namespace std; 3.4.void UpperCase char str / 将 str 中的小写字母转换成大写字母5. i=0; i <sizeofstr/sizeofstr0; +i 6.for size_t7.if 'a' <=stri && stri <='z' 8. stri -= 'a'- 'A' ; 9. 10.11.int mainint argc, charconst *argv str/sizeofstr0 << endl; 12. 13.char str = "aBcDeeeee" 14. cout << "str字符长度为 : " << sizeof15. UpperCase str ; 16. cout << str << endl; 17.return 0; 18. 答案:str 字符长度为 : 10ABCDEEEEe函数内的 sizeof 有问题;依据语法,sizeof 如用于数组,只能测出静态数组的大小,无法检测动态安排的或外部数组大小;函数外的 str 是一个静态定义的数组,因此其大小为 6,由于仍有 '0' ,函数内的 str 实际只是一个指向字符串的指针, 没有任何额外的与数组相关的信息,因此 sizeof 作用于上只将其当指针看,一个指针为 4 个字节,因此返回 4;PS:我的是 64 位的 CPU ,所以指针是 8 位5. 一个 32 位的机器 ,该机器的指针是多少位答案:名师归纳总结 指针是多少位只要看地址总线的位数就行了;80386 以后的机子都是32 的数据总线;所以指针的位数就是4 个第 2 页,共 4 页- - - - - - -精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆字节了;话说,64 位机子( CPU&OS )的指针同样是32 位的,即4 个字节,所以指针不是看CPU 的字长,而是地址总线的位数6. 关于数组指针cpp view plaincopy1. #include "stdio.h"2. int main int argc, char const *argv 3. 4. int a5=1,2,3,4,5; 5. int *ptr= int *&a+1; 6. printf "%d,%d n" ,*a+1,*ptr-1; 7. return 0; 8. 答案: 2, 5 *a+1 )就是 a1 , *ptr-1 就是 a4, 执行结果是 2, 5; &a+1 不是首地址 +1 ,系统会认为加一个 a 数组的偏移,是偏移了一个数组的大小(本例是 5 个 int ) int *ptr=int *&a+1; 就 ptr 实际是 &a5, 也就是 a+5 缘由如下:&a 是数组指针,其类型为 int *5; 而指针加 1 要依据指针类型加上肯定的值,不同类型的指针 +1 之后增加的大小不同 a 是长度为 5 的 int 数组指针, 所以要加 5*sizeofint 所以 ptr 实际是 a5 但是 prt 与 &a+1 类型是不一样的 这点很重要 所以 prt-1 只会减去 sizeofint* a,&a 的地址是一样的,但意思不一样,a 是数组首地址,也就是 a0 的地址, &a 是对象(数组)首地址,a+1 是数组下一元素的地址,即 a1,&a+1 是下一个对象的地址,即 a5. 7. 请问以下代码有什么问题:cppview plaincopy"hello" 1.#include "stdio.h"2.#include "string.h" 3.int main 4. 5.char a; 6.char *str=&a; 7. strcpystr,8. printfstr; 9.名师归纳总结 10. return 0; 第 3 页,共 4 页11.- - - - - - -精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆答案:没有为 str 安排内存空间,将会发生反常问题出在将一个字符串复制进一个字符变量指针所指地址;虽然可以正确输出结果,但由于越界进行内在读写而导致程序崩溃;即“ hello ”将会写入到 &a 以及之后的5 个(包括NUL ),就是说越界了,可能某个时候就爆发错误了8. char* s="AAA" printf"%s",s; s0='B' printf"%s",s; 有什么错?答案:"AAA" 是字符串常量; s 是指针, 指向这个字符串常量,所以声明 s 的时候就有问题;cosnt char* s="AAA" 然后又由于是常量,所以对是 s0的赋值操作是不合法的;即不能对常量进行写入,读取是可以的,“ char *s”换成“ char s 即可9. 写一个 “标准 ”宏,这个宏输入两个参数并返回较小的一个;答案: .#define MinX, Y X>Y.Y:X / 结尾没有 ; 10. 嵌入式系统中常常要用到无限循环,你怎么用 C 编写死循环;答案: while1 或者 for;名师归纳总结 - - - - - - -第 4 页,共 4 页