嵌入式 C 面试 考点

1.const的作用是什么?

第一,限定一个只读变量(不是常量)。如const double PI=3.14;第二,限定函数参数,如,void function(const char *p)//函数只能读取不能改变其变量p的值

2.关键字volatile有什么含意?

volatile影响编译器编译的结果,指出,volatile变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错。

3.嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit3,第二个清除a的bit3。在以上两个操作中,要保持其它位不变。

(1)把a的bit3赋值为1:a|=(0x01<<3);//a或等于1左移3位,这样保证其他的位不变,bit3被赋值为1;

(2)把a的bit3清除:a&=~(0x01<<3);//a与等于(1左移3位之后取反),这样保证其他的位不变,bit3被清除。

4.用typedef自定义的数据类型?

(1)用来定义一种类型的别名,这样,可以用它来连续定义变量,而不是简单的宏替换,比如:typedef char *PCHAR;PCHAR pa,pb;

(2)在C时代,定义了一个结构体之后,再使用的时候还要加上struct关键字才能用来定义变量,这样会比较麻烦,而使用typedef来定义之后,就可以不用写struct关键字了,比如:typedef struct tagPOINT{int x;int y;}POINT;POINT p1;当然,,C++里可以不用这样,因为C++使用结构体的时候不需要加struct关键字;

(3)用typedef来定义与平台无关的类型。比如你有一个跨平台的项目,需要统一使用一种双精度浮点型的类型,而在一些平台上可能没有这种实现,或者实现不同,这时候你就可以根据不同的平台来定义你自己的类型4,用来使复杂的定义简单化,最常用的就是给函数指针定义一个别名所以,总的来说,typedef并不是"发明"了另外一种新类型,而相当于是一种类型的别名,为了方便使用。

5.sizeof是一个运算符,运算结果是类型的大小(内存字节数);

strlen()是一个函数,返回值为一个字符串的长度。

6.写出short,char,unsigned char的表示范围?

1字节=8个位,在32位系统中一个char类型一般为8个bit,所以能存储的数据范围为-128~127,而unsigned char则是0~255,字符型所存储的数据是用来表示字符的,例如ASCⅡ或Unicode。Signed char的范围是-127到127,short -32767~+32768(2Bytes)。

7.编写一个strcpy()函数

void strcpy(char *strDest, char *strSrc)

{

while((*strDest++ = *strSrc++)! = "\0");

}

推荐另一种:为了实现链式操作,将目的地址返回:

char * strcpy(char *strDest, const char *strSrc)

{

assert((strDest != NULL) && (strSrc != NULL));

char *address = strDest;

while((*strDest++ = *strSrc++) != "\0");

return address;

}

8.内存的分配方式有几种,他们的区别,各举例。

(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量;

(2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集;

(3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。

9.const的用法,以及声明const变量与宏的区别。

const的用法有四种:参数、返回值、函数,用const修饰变量将限定变量为只读,该变量值不允许被改变。使用const还可以节省内存空间。define:定义预编译时处理的宏;只进行简单的字符替换,无类型检测const:定义程序中的常量,编译时处理;常量修饰符,把变量定义为常量。

10.static有什么用途?(至少说明两种)

1)限制变量的作用域

2)设置变量的存储域

11.队列和栈有什么区别?

栈(Stack)是限定只能在表的一端进行插入和删除操作的线性表。队列(Queue)是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。从"数据结构"的角度看,它们都是线性结构,即数据元素之间的关系相同。但它们是完全不同的数据类型。除了它们各自的基本操作集不同外,主要区别是对插入和删除操作的"限定"。栈和队列是在程序设计中被广泛使用的两种线性数据结构,它们的特点在于基本操作的特殊性,栈必须按"后进先出"的规则进行操作,而队列必须按"先进先出"的规则进行操作。和线性表相比,它们的插入和删除操作受更多的约束和限定,故又称为限定性的线性表结构。

12.写出冒泡排序代码:

13.c指令及用途:

14.sizeof及strlen区别:

sizeof定义:sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数,sizeof是一个运算符,运算结果是类型的大小(内存字节数);strlen()是一个函数,返回值为一个字符串的长度,strlen所作的仅仅是一个计数器的工作,它从内存的某个位置开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值。

15.写出short,char,unsigned char的表示范围?

16.(单片机)STM32的IO八种配置模式:

17.C指针的应用:

1.一些高级声明:

1)int *f(void);

f是一个函数,返回值类型是一个指向整型的指针。

2)int (*f) (void);

f是一个函数指针,它所指向的函数返回值类型是一个整型值。

3)int *(*f) (void);

f是一个函数指针,它所指向的函数返回值是一个整型指针,只有对其进行间接访问,才能得到一个整型值。

4)int *f[];

f是一个数组,它的元素类型是指向整型的指针(指针数组)。

5)int (*f[]) (void);

f是一个数组,数组元素的类型是函数指针,它所指向的函数返回值是整型值。

6)int *(*f[]) (void);

f是一个数组,数组元素的类型是函数指针,它所指向的函数返回值是指向整型的指针。

2.函数名

函数名被使用时总是由编译器把它转换成函数指针。

18.(硬件)选择电阻时要考虑什么?

选择电阻是需要考虑电阻的功率阻值允许加载在其两端的最大电压允许通过的最大电流等等.

19.(单片机)单片机上电后没有运转,首先要检查什么?

1)电源,查看单片机各引脚电压值是否正确;

2)查看晶振是否正常工作,可以用示波器查看;

3)查看最小系统有无接错,断路等毛病,用万用表。

20.(Linux)简述嵌入式Linux系统的初始化过程。

嵌入式Linux系统开机首先运行BootLoader,然后由BootLoader引导启动内核,由内核检查和初始化硬件设备,载入设备的驱动程序模块,安装root文件系统,然后内核将启动一个名为init的进程。在init运行完成并启动其它必要的后续进程后,系统开始运行,引导过程结束。init进程启动时需要读取inittab配置文件,该文件确定init在系统启动和关机时的工作特性。

发布了16 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Hilaph/article/details/102815849