嵌入式面试试题_2

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

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

2. 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个?

#define MIN(A,B) ((A) <= (B) ?(A) : (B))

3. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?
首选的方案是:

while(1) { }


4. 用变量a给出下面的定义
a) 一个整型数(An integer)
b) 一个指向整型数的指针(A pointer to an integer)
c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to apointer to an integer)
d) 一个有10个整型数的数组(An array of 10 integers)
e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointersto integers)
f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to afunction that takes an integer as an argument and returns an integer)

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


答案是:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integerargumentand returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take
aninteger argument and return an integer


5. 关键字static的作用是什么?
在C语言中,关键字static有三个明显的作用:
1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2).在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3).在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个
函数被限制在声明它的模块的本地范围内使用。


6.关键字const是什么含意?(能说出const意味着“只读”就可以了)

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

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


12、评价下面的代码片断:
unsigned int zero = 0;
unsigned int compzero = 0xFFFF;
/*1's complement of zero */

对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下:
unsigned int compzero = ~0;

这一问题真正能揭露出应试者是否懂得处理器字长的重要性。好的嵌入式程序员非常准确地明白硬件的细节和它的局限。


13、尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配内存的过程的。那么嵌入式系统中,动态分配内存可能发生的问题是什么?(这里,应试者能提到内存碎片,碎片收集的问题,变量的持行时间等等。)
下面的代码片段的输出是什么,为什么?
Char *ptr;
if ((ptr = (char *)malloc(0)) == NULL)
puts("Got a null pointer");
else
puts("Got a valid pointer");

这是一个有趣的问题,不经意把0值传给了函数malloc,得到了一个合法的指针之后,该代码的输出是“Got a validpointer”。用这个来开始讨论这样的一问题,看看被面试者是否想到库例程这样做是正 确。


14、 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 两个指针


15、C语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么?
int a = 5, b = 7, c;
c = a+++b;

上面的例子是完全合乎语法的。问题是编译器如何处理它?根据最处理原则,编译器应当能处理尽可能所有合法的用法。因此,上面的代码被处理成:c = a++ + b;因此, 这段代码持行后a = 6, b = 7, c = 12。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值