【C语言敲重点(五)】嵌入式“八股文“(2)

1. struct和union的区别?

答:①联合体所有的成员都共享一块内存,修改联合体的任一成员的数据就会覆盖到其他成员的数据;
②结构体的成员变量都有独立的内存空间,且结构体的成员数据之间是不影响的

2. struct和class的区别?

答:①访问权限不同:class默认是私有的private,struct默认是公共的public
②继承权限不同:class默认是私有的private,struct默认是公共的public
③class可以用于定义模板,而struct不能

3. 指针和地址偏移问题

int main(){
    unsigned char *p1;
    unsigned long *p2;
    p1 = (unsigned char *)0x801000;
    p2 = (unsigned long *)0x810000;
    //p1+5偏移sizeof(unsigned char)*5 = 1*5
    printf("p1+5 = %p\n",p1+5); //答案:0x801005
    //p1+5偏移sizeof(unsigned long)*5=8*5=40(十进制)= 28(十六进制)
    printf("p2+5 = %p\n",p2+5); //答案:0x810028
    return 0;
}

4. 宏定义的陷阱 – “无脑替换”

#define CUBE(x)     x*x*x
int main(){
    int a = 3;
    printf("%d\n", CUBE(a)); //CUBE(a) = a*a*a = 27
    //CUBE(a+1) = a+1*a+1*a+1 = a+a+a+1 = 10
    printf("%d\n", CUBE(a+1));
    return 0;
}

5. 大小端字节序判断

  • 大端字节序:高地址存放数据的低位(网络字节序)
  • 小端字节序:高地址存放数据的高位(X86 PC)
union Test{
    short a;
    char b[2];
};

int main(){

    union Test test;
    test.a = 0x1234;
    if(test.b[0] == 0x12){  //低地址放高位
        printf("Big Endian\n");
    }
    if(test.b[0] == 0x34){  //低地址放低位
        printf("Small Endian\n");
    }

    return 0;
}

6.【面试真题】

  • 在X86架构的PC机上,下列程序输出结果是( A )

在这里插入图片描述

7. 枚举enum的赋值规则

在这里插入图片描述
在这里插入图片描述

8. 左值(lvalue)和右值(rvalue)的区别?

答:①左值:表示一个可被标识和修改的内存位置,可以出现在=左边的变量,其值可以改变,存储在内存中具有持久性。(典型的左值包括变量、数组元素和通过引用或指针访问的对象)
②右值:不能被赋值的常量、表达式,特点是可读。一般是临时的中间值或者常量。
③通常左值可以做右值,右值不能做左值(如:i++ = 5的写法是错误的)
注意:数组名是常量,不能被赋值,也就是数组名是右值。
(当定义char array[10] = “hello”时,array++和array=array+1都是错误的写法)
(区别定义char *array = “hello”时,array++和array=array+1的写法是允许的)

9. ++a和a++的区别?

  • 如果有表达式 a = i++ ;它等价于 a = i;i = i + 1(先赋值再自增,右值)
  • 如果有表达式 a = ++i;它等价于i = i + 1;a = i(先自增再赋值,左值)
    在这里插入图片描述

10. 在1G内存的PC中能否malloc(1.2G)?为什么?

答:可能可以。因为malloc是向进程申请虚拟内存,与物理地址空间没有直接关系。

11. 数组的负数下标

【面试真题】 写出下面程序的输出结果:0 1 2 3 4 5
在这里插入图片描述

12. 判断有符号、无符号整数

【面试真题】 写出判断一个整数是否是无符号整数的宏定义:
在这里插入图片描述

13. select、poll和epoll的区别?

答:①select相比于poll和epoll,支持跨平台可移植性好;但是select的实现是依赖轮询机制,且每次调用都需要在用户态和内核态之间复制拷贝所有文件描述符,因此效率比较差,并且监听的最大文件描述符数量也有限制,一般是1024个。
②poll在select的基础上,有了一定的改进和优化;但是底层实现机制和select一样,在效率上并没有大的提升。
③epoll相比于前面select和poll,可以说是最高效最常用的。它是基于内核事件驱动机制实现对事件的监听,底层通过红黑树和链表来存储监听的文件描述符和事件,当监听到事件发生,以消息通知的机制处理对应的文件描述符,避免了前面select和poll轮询机制的缺点,提高了效率,且没有文件描述符数量的限制。

14. 面向对象三大特征

继承、封装、多态

在这里插入图片描述

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
宋宝华嵌入式 C/C++语言精华文章集锦 C/C+语言 struct 深层探索 ............................................................................2 C++中 extern "C"含义深层探索........................................................................7 C 语言高效编程的几招...............................................................................11 想成为嵌入式程序员应知道的 0x10 个基本问题 .........................................................15 C 语言嵌入式系统编程修炼...........................................................................22 C 语言嵌入式系统编程修炼之一:背景篇 ............................................................22 C 语言嵌入式系统编程修炼之二:软件架构篇 ........................................................24 C 语言嵌入式系统编程修炼之三:内存操作 ..........................................................30 C 语言嵌入式系统编程修炼之四:屏幕操作 ..........................................................36 C 语言嵌入式系统编程修炼之:键盘操作 ..........................................................43 C 语言嵌入式系统编程修炼之六:性能优化 ..........................................................46 C/C++语言 void 及 void 指针深层探索 .................................................................50 C/C++语言可变参数表深层探索 .......................................................................54 C/C++数组名与指针区别深层探索 .....................................................................60 C/C++程序员应聘常见面试题深入剖析(1) ..............................................................62 C/C++程序员应聘常见面试题深入剖析(2) ..............................................................67 一道著名外企面试题的抽丝剥茧 ......................................................................74 C/C++结构体的一个高级特性――指定成员的位数 .......................................................78 C/C++中的近指令、远指针和巨指针 ...................................................................80 从两道经典试题谈 C/C++中联合体(union)的使用 ......................................................81 基于 ARM 的嵌入式 Linux 移植真实体验 ................................................................83 基于 ARM 的嵌入式 Linux 移植真实体验(1)――基本概念 ...........................................83 基于 ARM 的嵌入式 Linux 移植真实体验(2)――BootLoader .........................................96 基于 ARM 的嵌入式 Linux 移植真实体验(3)――操作系统 ..........................................111 基于 ARM 的嵌入式 Linux 移植真实体验(4)――设备驱动 ..........................................120 基于 ARM 的嵌入式 Linux 移植真实体验(5)――应用实例 ..........................................135 深入浅出 Linux 设备驱动编程 .......................................................................144 1.Linux 内核模块..............................................................................144 2.字符设备驱动程序 ...........................................................................146 3.设备驱动中的并发控制 .......................................................................151 4.设备的阻塞与非阻塞操作 .....................................................................157
嵌入式C语言八股文是指在嵌入式系统开发中常见的基本知识点和技能要求的简要总结。下面是嵌入式C语言八股文的主要内容: 1. 数据类型:包括基本数据类型(如int、char、float等)和派生数据类型(如数组、结构体、枚举等),掌握各种数据类型的使用方法和特点。 2. 运算符:熟悉各种算术运算符、逻辑运算符、位运算符等,掌握它们的优先级和结合性,能够正确使用运算符完成各种计算任务。 3. 控制语句:包括条件语句(if-else语句)、循环语句(for、while、do-while循环)、选择语句(switch-case语句)等,掌握这些语句的使用方法和注意事项。 4. 函数:了解函数的定义和调用,能够编写函数并正确使用函数参数和返回值,理解函数的作用域和生命周期。 5. 数组和指针:掌握数组和指针的定义和使用,了解数组和指针在内存中的存储方式,能够通过指针进行数组的访问和操作。 6. 文件操作:了解文件操作的基本流程,包括文件的打开、读写和关闭,理解文件指针和文件访问模式的概念。 7. 中断处理:了解中断的基本概念和原理,能够编写中断服务程序(ISR)并正确处理中断请求。 8. 程序调试:掌握常用的调试技巧和工具,能够使用调试器进行程序的单步执行、观察变量值等操作,能够分析程序运行过程中的错误和异常。 以上是嵌入式C语言八股文的主要内容,掌握这些知识和技能,可以帮助你在嵌入式系统开发中更好地应对各种任务和挑战。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AF_INET6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值