【嵌入式面试题】常见的面试题梳理一

注:看面试题时,主要应该以学习为主,面试题有些基本上是我们编程时会遇上的问题,通过学习面试题会提升我们的编程意识和解决一些日常我们编程所遇到的问题,看完这篇面试题后,希望能对你有所帮助,另外题中有问题的地方可以在评论区指出,在这里谢谢您的观看。


  1. C语言有多少关键字?
    32个,注意sizeof是关键字,不是函数。

  2. C程序的一般结构那些?
    顺序,分支,循环

  3. 简单列举几种常用的循环结构和分支结构。
    循环:For,while do,if goto(慎用)。
    分支:if else, switch case(注意default 的使用,和break 的添加)。

  4. while 和dowhile 有何区别?
    前者先判断再执行,后者先执行再判断;后者比前者多执行一次

  5. continue 和 break 有何需别?
    前者结束本次循环继续下次循环,后者直接退出循环。

  6. register 有何作用?
    声明一个变量常驻寄存器,直接从寄存器内使用变量,以达到提高程序运行效率的目的,在嵌入式开发中尤其常用,但它是一个建议性的声明,因为寄存器数量有限,编译器会根据程序情况决定是否申请成功。

  7. static 有何作用?
    限定存储域
    限定作用域

  8. volatile关键字有什么用途?
    volatile 关键字是一种类型修饰符,声明为一个异变的变量,防止编译器优化,使每次变量使用与储存都要从内存进行。一般程序使用变量会将变量从内存取到寄存器中使用,当多次调用一个变量时,由于编译优化会导致每次直接从寄存器中使用变量,而变量本身存储的值不会发生改变。

  9. 指针函数和函数指针有和区别?
    前者是 一个函数返回值 为 指针类型;
    后者是 一个指针,指向 函数入口地址。

  10. 简述0,‘0’,“0”,'\0’的区别。
    数值0
    字符0(ascii码数值为48)
    字符串0(占两个字节,有‘\0’作为结束符)
    字符串结束标志(其数值等于0是绝对的0,但意义不同)

  11. 使用gets时应注意哪些事项?
    防止越界,gets不检查目的地址的空间大小。

  12. 简述堆和栈的区别:
    前者为程序员动态分配,创建和销毁都需要手动完成(使用完一定要销毁,防止内存泄露);
    后者为系统自动分配,在函数返回时自动销毁(所以不能在函数中返回变量)。

  13. 函数传参有哪些方法?各有何特色?
    值传递和地址传递
    前者在传递时函数形参接受实参的拷贝,所以原形参不会被改变(但是大数据的拷贝会降低效率);
    后者传递变量的地址,不需拷贝,但是会改变参数的值。

  14. 全局变量和局部变量有何区别?
    前者在静态区,作用域是整个程序;
    后者在栈区,作用域仅限于函数内部。

  15. 局部变量能否和全局变量重名?
    可以,但局部变量会屏蔽全局变量。

  16. 静态全局变量和普通全局变量有何区别?
    存储域方面:都相同,都存储在静态区;
    作用域方面:不同,前者只能在当前文件使用,后者是全局可见。

  17. 静态局部变量和普通局部变量有何区别?
    作用域:相同,都在函数内部;
    但是生命周期不同,前者生命周期为整个程序的生命周期知道程序退出后自动消亡;后者生命周期为一次函数调用,函数返回即销毁。

  18. 地址对齐方式有哪几种?
    字节对齐,半字对齐,字对齐

  19. 结构体字节对齐问题

Struct a{
    
    
	Char a;
	Int b;
	Short c;
}
Sizeof(a) = ?

结构体a的大小是4*3=12个字节,而不是1+2+4=7个字节;这里主要考察内存对齐(地址对齐)的特点,应为结构体中最大数据宽度是整型(4字节),所以按字对齐。

  1. 程序的局部变量存在于(栈区)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆区)中。

  2. 结构体和联合体的区别?
    都是用户自定义的类型,但结构体内的元素各自有着自己的内存空间,而联合体内的元素共用一块内存空间

  3. 宏函数与内联函数和普通函数的执行效率的比:
    宏函数效率高,因为是编译器在预处理阶段的替换;

  4. C语言中注释有哪些方法?
    /* */#if 0 #endif
    后者是预处理命令,可以方便的对代码区进行选择编译。

  5. 解释一下语句的含义:

const int a; 
int const a; 
const int *a; 
int * const a; 
const int const * a;

前两个的作用是一样,a是一个常整型数
第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。
第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。
最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。

int * a;
*a = 2;

上式有错吗,错到哪里?
指针没有得到地址

  1. 头文件中的 ifndef/define/endif 干什么用?
    答:防止该头文件被重复引用。

  2. #include <filename.h> 和 #include “filename.h” 有什么区别?
    对于#include <filename.h> ,编译器从标准库路径开始搜索 filename.h
    对于#include “filename.h” , 编译器从用户的工作路径开始搜索 filename.h

  3. 说明extern关键字的作用
    (1)申明为外部变量或者函数,让函数和变量可以在定义变量或函数的文件外使用
    (2)在C++中,申明为按照C语言的方式编译和链接

  4. 结构体与数组的区别
    结构体可以包含不同的数据结构,是一个自定义类型,可以作为左值赋值。
    而数组是一类数据类型的数据集合,它本身不是数据类型,所以不能作为左值赋值,数组名是常指针

  5. 内存溢出和内存泄露有什么区别?
    内存溢出是由于程序分配的空间,但不够使用,例如申请了一个4个字节的空间,但要使用的内容却是8个字节
    内存泄漏,是由于申请了内存而无法释放。

  6. 如果判断单链表是否有环?
    快慢指针,相遇则存在环

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_51447215/article/details/126870470