1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)?
2. 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个?
3. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?
首选的方案是:
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)
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
在C语言中,关键字static有三个明显的作用:
1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2).在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3).在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个 函数被限制在声明它的模块的本地范围内使用。
前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意
味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不 可修改的)。
对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下:
下面的代码片段的输出是什么,为什么?
这是一个有趣的问题,不经意把0值传给了函数malloc,得到了一个合法的指针之后,该代码的输出是“Got a validpointer”。用这个来开始讨论这样的一问题,看看被面试者是否想到库例程这样做是正 确。
tPS p3,p4;
第一个扩展为struct s * p1,p2;上面的代码定义p1为一个指向结构的指,p2为一个实际的结构,这也许不是你想要 的。第二个例子正确地定义了p3 和p4 两个指针 。
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
2. 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个?
#define MIN(A,B) ((A) <= (B) ?(A) : (B))
3. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?
首选的方案是:
while(1) { }
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
在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是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不 可修改的)。
unsigned int zero = 0;
unsigned int compzero = 0xFFFF;
/*1's complement of zero */
对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下:
unsigned int compzero = ~0;
这一问题真正能揭露出应试者是否懂得处理器字长的重要性。好的嵌入式程序员非常准确地明白硬件的细节和它的局限。
下面的代码片段的输出是什么,为什么?
Char *ptr;
if ((ptr = (char *)malloc(0)) == NULL)
puts("Got a null pointer");
else
puts("Got a valid pointer");
这是一个有趣的问题,不经意把0值传给了函数malloc,得到了一个合法的指针之后,该代码的输出是“Got a validpointer”。用这个来开始讨论这样的一问题,看看被面试者是否想到库例程这样做是正 确。
#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 两个指针 。
int a = 5, b = 7, c;
c = a+++b;
上面的例子是完全合乎语法的。问题是编译器如何处理它?根据最处理原则,编译器应当能处理尽可能所有合法的用法。因此,上面的代码被处理成:c = a++ + b;因此, 这段代码持行后a = 6, b = 7, c = 12。