background image

嵌入式软件面试题集锦.txt

(如果你想知道更详细的答案,仔细读一下Saks的文章吧。)如果应试者能正确回答这个问题,我将问他一个附加的问
题:下面的声明

都是什么意思? 

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

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

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

个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。如果应试者能正确
回答这些问

题,那么他就给我留下了一个好印象。顺带提一句,也许你可能会问,即使不用关键字 const,也还是能很容易写出功能
正确的程序,

那么我为什么还要如此看重关键字const呢?我也如下的几下理由:

1). 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参
数的应用目

的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很
少会留下的垃

圾让别人来清理的。) 

2). 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。 

3). 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,
这样可以减少

    bug的出现。

Volatile 

8. 关键字volatile有什么含意 并给出三个不同的例子。 一个定义为volatile的变量是说这变量可能会被意想不到地改
变,这样,编译

器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而
不是使用保存

在寄存器里的备份。下面是volatile变量的几个例子: 

1). 并行设备的硬件寄存器(如:状态寄存器) 

2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) 

3). 多线程应用中被几个任务共享的变量 

回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员
经常同硬件、

中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。 

假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得
volatile完全的重

要性。

1). 一个参数既可以是const还可以是volatile吗?解释为什么。 
2). 一个指针可以是volatile 吗?解释为什么。 
3). 下面的函数有什么错误:

int square(volatile int *ptr) 

   return *ptr * *ptr; 

第 3 页