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;