1.写一个”标准”宏MIN ,这个宏输入两个参数并返回较小的一个。
分析:
1) 标识#define在宏中应用的基本知识。在 嵌入(inline)操作符 变为标准C的一部分之前,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。
2)三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。
3) 懂得在宏中小心地把参数用括号括起来
参考答案:
#define MIN(A,B) ((A) <= (B) ? (A) : (B))
2.用预处理指令#define 声明一个常数,用以表明1年中有多少秒。
分析:
1) #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)
2)知道预处理器将会为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
3) 要意识到这个表达式将使一个16位机的整型数溢出,因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
4) 如果你在你的表达式中用到UL(表示无符号长整型),那面试效果会更好。
参考答案:
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
3.关键字static有什么用途?(请至少说明两种)
参考答案:
在C语言中,关键字static有三个明显的作用:
1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
4.关键字const有什么含意?
参考答案:
1.定义const常量
2.const可以修饰函数的参数和返回值,在C++中,还可以修饰函数的定义体
被const修饰的东西都受到保护,可以防止意外的改动,能提高程序的健壮性
扩展:
下面声明都是什么意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
参考答案:
前两个的作用是一样,a是一个常整型数
第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)
第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)
最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)
5.关键字volatile有什么含意?并给出三个不同的例子?
参考答案:
优化器在用到这个变量时必须每次重新从内存去读写这个变量的值,而不是使用保存在cache中数据。
下面是volatile变量的几个例子:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;
6.解释下面a的含义:
a) int a; ——– 一个整型数
b) int *a; ——– 一个指向整型数的指针
c) int **a; ———一个指向指针的的指针,它指向的指针是指向一个整型数
d) int a[10]; ——– 一个有10个整型数的数组
e) int *a[10]; ——– 一个有10个指针的数组,该指针是指向一个整型数的
f) int (*a)[10]; ——–一个指向有10个整型数数组的指针
g) int (*a)(int); ——– 一个指向函数的指针,该函数有一个整型参数并返回一个整型数
h)int (*a[10])(int); —— 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
7.已知:
char str[] = “farsight”;
char *p = malloc( 100 );
int n = 10;
void Foo ( char var[100]){}
请计算
sizeof (str ) = 9
sizeof ( p ) = 4
sizeof ( n ) = 4
sizeof ( var ) = 4
8.嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。
参考答案:
volatile unsigned int *a;
*a |=(1<<3);
*a &= ~(1<<3);