嵌入式笔试刷题专栏(第一天)
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 内核、以及实用电路知识等内容。