嵌入式考点(面试总结)

说明:考点都是从面试题目中总结出来,会不停的面试不停的更新,协议方面的会放到另外一篇文章。

1.大小端问题(首当其冲,大疆和很多公司都会考)
大端模式:数据的高字节保存在低地址当中,低字节保存在高地址当中。和我们看数字的习惯一样。
小端模式:数据的高字节保存在高地址当中,低字节保存在低地址当中。

unsigned int value = 0x12345678

上面的数用数组来表示
大端模式
图片说明
小端模式
图片说明

数据以小端模式存放, 下面程序的运行结果是a.i =
union{
  int i;
  char x[2];
}a;
void main(){
  a.x[0] =10; 
  a.x[1] =1;
  printf("%d",a.i);
}

这是一道真题,因为是一个共同体结构体,i的地址和x[]是公用的,按照题目和上面的例子,x[0]是低地址存的是i的低位,x[1]是高地址存的是i的高位,所以i=0x1A=26

注意:Intel的80x86系列芯片是唯一还在坚持使用小端的芯片,ARM芯片默认采用小端,但可以切换为大端。对于大小端的处理也和编译器的实现有关,在C语言中,默认是小端,STM32F407也是小端(可以自己调整的)(但在一些对于单片机的实现中却是基于大端,比如Keil 51C),Java是平台无关的,默认是大端。在网络上传输数据普遍采用的都是大端。

2.指针指向变量问题
若已定义a为int类型变量,则对指针P的正确说明和初始化的是()
A.int p=a B.int *p=a C.int p=&a D.int *p =&a

//指针所指向的是变量的地址,所以上面明显选D,因为是在定义中指向*p代表的是指向的地址而不是值
int a = 100;
int *p_a = &a;

还有一题:
用C语言定义一个指向有10个整形数数组的指针?

int *p=new int[n];
或者
int a[10];
int *p=a;

3.转义字符
设有语句char a =‘\72’,则变量a=()
A.包含1个字符 B.包含2个字符 C.包含3个字符 D. 说明不合法
答:\是转义符,表示a当中存储的是8进制数72对应的ASCII码字符 “:”,因此只有一个字符选A

4.共同体结构体大小问题

//假设char型变量占一个字节的存储单元, int型变量占两个字节的存储单元,float型变量占四个字节的存储单元,若有定义: 
 union 
{
    int i; 
    char ch; 
    float f;
}x;
则联合变量x在内存中所占字节数为(   )。
    A. 7    B. 5    C. 6    D. 4

图片说明

5.如何在C++代码中包含非系统C头文件?
如果在C++系统中使用一个非系统提供的c头文件时,需要将#include代码用extern “C”{}包含起来,这个声明告诉C++编译器,包含在内的是C函数的头文件。

//C++ 代码

extern "C" {
//get declaration for f(int i, char c, float x)
  #include "my-c-code.h"
}

int main()
{
  f(7, 'x', 3.14);   //正常调用
}

6.static的作用:常用来修饰变量。
这个说的不错

https://blog.csdn.net/zzyzgg/article/details/89842744

(1)修饰局部变量
static修饰局部变量时,使得被修饰的变量成为静态变量,存储在静态区。存储在静态区的数据生命周期与程序相同,在main函数之前初始化,在程序退出时销毁。(无论是局部静态还是全局静态)
(2)修饰全局变量
全局变量本来就存储在静态区,因此static并不能改变其存储位置。但是,static限制了其链接属性。被static修饰的全局变量只能被该包含该定义的文件访问(即改变了作用域)。
(3)修饰函数
static修饰函数使得函数只能在包含该函数定义的文件中被调用。对于静态函数,声明和定义需要放在同一个文件夹中。
(4) 修饰成员变量
用static修饰类的数据成员使其成为类的全局变量,会被类的所有对象共享,包括派生类的对象,所有的对象都只维持同一个实例。 因此,static成员必须在类外进行初始化(初始化格式:int base::var=10;),而不能在构造函数内进行初始化,不过也可以用const修饰static数据成员在类内初始化。
(5)修饰成员函数
用static修饰成员函数,使这个类只存在这一份函数,所有对象共享该函数,不含this指针,因而只能访问类的static成员变量。静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问。例如可以封装某些算法,比如数学函数,如ln,sin,tan等等,这些函数本就没必要属于任何一个对象,所以从类上调用感觉更好,比如定义一个数学函数类Math,调用Math::sin(3.14);还可以实现某些特殊的设计模式:如Singleton;

全部评论

相关推荐

评论
4
5
分享
牛客网
牛客企业服务