嵌入式笔试刷题专栏(第一天)

1.(void *)ptr和(*(void **))ptr的结果是否相同? 其中ptr为同一个指针

第 1 题:void *ptr*(void **)ptr 有什么区别?

📌 考点: 指针类型转换、void 指针用法

👀 易错点: 误以为 void* 可直接解引用

  • void *ptr; 是一个通用指针,指向任意类型,但不能直接解引用(没有类型信息)。
  • *(void **)ptr:假设 ptr 本身是一个 void** 类型的变量,即 ptr 指向一个 void*,可以解引用得到一个 void*

🧠 举例:

void *a = malloc(4);
void **b = &a;
void *c = *b;  // 相当于 *(void **)b,没问题

void *x = b;   // 错误用法!x 是 void*,不能表示 void**
void *y = *x;  // 错误,void* 不能解引用

2.要对绝对地址0x100000赋值,我们可以用(unsigned int *)0x100000=1234; 那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?

第 2 题:如何跳转到 0x100000 执行一段程序?

📌 考点: 裸机开发、函数指针强制转换

🧠 在嵌入式中,经常需要跳转到特定 Flash/ROM 地址执行,比如 OTA 升级、Bootloader 跳转。

🧾 写法如下:

typedef void (*jump_func)(void);
jump_func jump = (jump_func)0x100000;
jump();  // 跳转到 0x100000 处执行

⚠️ 注意:

  • 必须确认该地址有有效代码,并且是可执行段。
  • 跳转前可能要关闭中断、重配置堆栈等。

3.给定结构体

   struct A

   {

       char t:4;

       char k:4;

       unsigned short i:8;

       unsigned long m;

}; 问sizeof(struct A)是多少?

第 3 题:结构体位域的 sizeof

📌 考点: 内存对齐、位域填充

结构体位域字段虽然按位分配,但实际大小依赖对齐规则。

🧠 示例:

struct A {
    unsigned int a:1;
    unsigned int b:3;
    unsigned int c:2;
};
std::cout << sizeof(A) << std::endl; // 输出 4 或 8,依实现而异

  • 一般位域按 int 对齐。
  • 关键点:不能假设位域节省空间,需依赖编译器布局策略。

4..int main()

 {

 

}

第 4 题:空的 main() 函数会返回什么?

📌 考点: main 函数返回值

int main() { }

⛔ 这其实是 UB(未定义行为),虽然一些编译器会默认补上 return 0;,但标准要求返回值必须明确。

✔ 推荐:

int main() {
    return 0;
}

5.编写函数void hton(float val,char *buf)把小端序的val转换成大端序的val,存放到buf中

第 5 题:实现 hton(float)

📌 考点: 浮点数与字节序转换

htonl 只能处理整数类型,如何将 float 进行大端转换?

🧾 示例实现:

float htonf(float val) {
 

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式笔试专栏 文章被收录于专栏

本专栏系统整理了嵌入式方向笔试中常见的知识点和高频考题,涵盖基础理论、常用算法、C语言陷阱、操作系统原理、驱动开发、常见外设通信协议(如 I2C/SPI/UART)、RTOS、Linux 内核、以及实用电路知识等内容。

全部评论
点赞 回复 分享
发布于 04-25 21:38 山西
😄😄😄😄
点赞 回复 分享
发布于 04-25 16:22 上海

相关推荐

05-23 12:00
门头沟学院 C++
&nbsp;5.22一面,总共时长125min1.如何保护用户的隐私2.int*&nbsp;createArray()&nbsp;{int&nbsp;arr[3]&nbsp;=&nbsp;{1,&nbsp;2,&nbsp;3};&nbsp;return&nbsp;arr;}&nbsp;这段代码有什么问题3.对上述代码进行改进,写出能想到的所有方法(我写了一个malloc,全局数组,静态数组)4.说一下三种方式的优缺点5.全局数组和静态数组有什么区别6.解释完美转发的作用及实现方式7.const&nbsp;int*,int&nbsp;const*,int*&nbsp;const,&nbsp;const&nbsp;int*&nbsp;const的区别8.实现一个无锁计数器9.调用C++11实现一个线程安全的有界环形队列(circular&nbsp;buffer),要求如下:支持多线程环境下的并发push和pop操作,队列有固定容量,满时push操作要阻塞,空时pop操作要阻塞。不允许使用第三方库,只能用C++11标准库,说明你的实现如何保证线程安全,并分析可能的性能瓶颈。10.unique_lock&nbsp;和&nbsp;lock_guard的区别,为什么你刚才给我的代码用的是unique_lock&nbsp;而不是&nbsp;lock_guard&nbsp;呢11.你写的代码的性能瓶颈是什么?如果有大量得到生产者和消费者会怎样呢12.把第9个改成非阻塞的,写一下,为什么你这个非阻塞用lock_guard这个锁呢13.有一类二叉树用三叉链表来存储的时候除了带有指向左右孩子节点的两个指针,还有指向父节点的指针,那么这样一棵二叉树有n个节点,那么有多少指针指向NULL(对于不存在的节点表示为空)14.int&nbsp;n&nbsp;=&nbsp;2019;&nbsp;int&nbsp;count&nbsp;=&nbsp;0;&nbsp;&nbsp;while(n){count++;&nbsp;n&nbsp;=&nbsp;n&amp;(n&nbsp;-&nbsp;1);}&nbsp;cout&nbsp;&lt;&lt;&nbsp;count&nbsp;&lt;&lt;&nbsp;endl;输出是多少,为什么15.给定一个递增循环整数数组,从里面找出最小的元素,使用的算法越快越好。特别地,最小的元素可能出现在数组中间。比如:50,52,63,90,3,8,15,44,49,int&nbsp;findmin(int&nbsp;array[]){}16.在二叉排序树上面找出第3大的节点。注意:不能把二叉树全量存储到另外的存储空间,比如存储到数组中,然后取出数组的第三个元素。class&nbsp;TreeNode&nbsp;{public:int&nbsp;value;TreeNode*left;TreeNode*&nbsp;right};TreeNode*&nbsp;find(TreeNode*root)&nbsp;{}17.动态规划题:给定一个长度为l的木棍,已知有n个切割点,要求在每个切割点都要切割,注意每次切割的开销为当前木棍的长度,例如一个10米的木棍,切割点为2,4,7。有多种切割方式,其中可以先切2,再切4,再切7,此时开销为10+8+6=24(第1次切木棍为10米,笑2次切木棍为8米,第3次切木棍为6米),也可以先切4,再切2,再切7,出约著销为10+4+6=20,这时开销更小你的任务是计算切割的最小开销。
腾讯一面2118人在聊 查看17道真题和解析
点赞 评论 收藏
分享
评论
1
4
分享

创作者周榜

更多
牛客网
牛客企业服务