嵌入式面试题收集

1、用预处理指令#define  声明一个常数,用以表明1 年中有多少秒(忽略闰年问题) 

   #define  SECONDS_PER_YEAR   (60   *  60  *  24  *  365)UL

 意识到这个表达式将使一个 16位机的整型数溢出‐ 因此要用到长整型符号L, 告诉编 译器这个常数是的长整型数。

2、用变量a 给出下面的定义 

a)   一个整型数(An  integer )  

int   a;
b) 一个指向整型数的指针(  A  pointer   to   an  integer )  

int *a;
c) 一个指向指针的的指针,它指向的指针是指向一个整型数(  A  pointer   to   a   pointer   to  an  integer )  

int  **a;

d) 一个有10个整型数的数组(  An  array  of   10  integers )  

int a[10];
e)   一个有10个指针的数组,该指针是指向一个整型数的。(An  array  of   10  pointers  to  integers )  

int  a[10];
f)   一个指向有 10个整型数数组的指针(  A  pointer   to   an  array of   10  integers )

int *a[10];

g)   一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A  pointer   to   a   function   that   takes  an  integer   as  an  argument  and   returns  an   integer )

int (*a)(int);
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型 数 (  An  array  of   ten   pointers  to   functions   that   take   an  integer   argument   and   return   an  integer   )

int  (*a[10])(int);

3、嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。 
这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:

第一种方法:

int  *ptr ;
ptr = 0x67a9;
*ptr = 0xaa66;

第二种方法:

*(int  * const)(0x67a9) = 0xaa66;

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

 用 #defines 和 bit masks 操作。这是一个有极高可移植性的方法,是应该被用到的方法。最佳的解决方案如下: 

#define BIT3 (0x1<<3) 
static int a; 
void set_bit3(void) 
{ 
	a |= BIT3; 
} 
void clear_bit3(void)
{ 
	a &= ~BIT3; 
} 

一些人喜欢为设置和清除值而定义一个掩码同时定义一些说明常数,这也是可以接受的。我希望看到几个要点:说明常数、|=和&=~操作。

5、Typedef 在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。

例如,思考一下下面的例子: #define dPS struct s * typedef struct s * tPS; 
以上两种情况的意图都是要定义dPS 和 tPS 作为一个指向结构s指针。哪种方法更好呢?(如果有的话)为什么? 
这是一个非常微妙的问题,任何人答对这个问题(正当的原因)是应当被恭喜的。

答案是:typedef更好。

思考下面的例子: 
dPS p1,p2;

 tPS p3,p4; 

第一个扩展为 struct s * p1, p2; 
上面的代码定义p1为一个指向结构的指针,p2为一个实际的结构,这也许不是你想要的。

第二个例子正确地定义了p3 和p4 两个指针。

6、评价下面的代码片断:  
unsigned int zero = 0; 
unsigned int compzero = 0xFFFF; 
对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下: unsigned int compzero = ~0; 
这一问题真正能揭露出应试者是否懂得处理器字长的重要性。在我的经验里,好的嵌入式程序员非常准确地明白硬件的细节和它的局限,然而PC机程序往往把硬件作为一个无法避免的烦恼。

7、引用与指针有什么区别?
1) 引用必须被初始化,指针不必。 
2) 引用初始化以后不能被改变,指针可以改变所指的对象。 
3) 不存在指向空值的引用,但是存在指向空值的指针。

8、用宏定义写出swap(x,y) 

#define swap(x, y)\
 x = x + y;\
 y = x - y;\
 x = x - y; 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值