注:看面试题时,主要应该以学习为主,面试题有些基本上是我们编程时会遇上的问题,通过学习面试题会提升我们的编程意识和解决一些日常我们编程所遇到的问题,看完这篇面试题后,希望能对你有所帮助,另外题中有问题的地方可以在评论区指出,在这里谢谢您的观看。
一、关于宏的一些问题
1.1 用预处理指令 #define
声明一个常数,用以表明1年中有多少秒(忽略闰年问题)。
#define SECONDS_PER_YEAR (365*24*60*60)UL
1.2. 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个
#define MIN(x, y) ((x)<=(y)?(x):(y))
1.3 预处理器标识 #error
的目的是什么?
#error 记号序列,将使预处理器打印包含该记号序列的诊断信息。
1.4 (被面试官问过
)嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?
While(1)、for()、goto
二、关于变量的一个常见问题
用变量a给出下面的定义(有时候面试题是英文的,下面也给了英文的表示)
- 一个整型数(An integer)
- 一个指向整型数的指针( A pointer to an integer)
- 一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an intege)r
- 一个有10个整型数的数组( An array of 10 integers)
- 一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to integers)
- 一个指向有10个整型数数组的指针( A pointer to an array of 10 integers)
- 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)
- 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an integer )
1 int a;
2 int *a;
3 int **a;
4 int a[10];
5 int *a[10];
6 int (*a)[10];
7 int (*a)(int );
8 int (*a[10])(int );
三、关于关键字的一些问题
3.1 关键字static
的作用
- 在函数体内,
被声明为静态的变量
在函数内 被调用的过程中 维持值不变,这个局部变量存储域发生改变
,从栈区到静态区中,所以这个值不变。(static局部变量只被初始化一次,下一次依据上一次结果值;
- 在模块内被声明的静态全局变量,能被模块内部声明之后的函数调用,但
不能被模块外的函数调用
。所以声明为静态的全局变量的作用域发生改变
,限制了它的使用范围。 - 对于可在原模块外部使用的函数,应该在一个头文件中说明,要使用这些函数的模块需包含这个头文件
3.2 关键字const
的作用
- 使用const关键字的地方是为了说明这个参数为常量,是不能被修改的。
- 防止被无意的代码修改。
- 使代码更加紧凑。
3.3 关键字volatile
有什么含意?并给出三个不同的例子。
volatile修饰符告诉编译程序不要对该变量所参与的操作进行优化
。
例子:
- 并行设备的硬件寄存器。存储器映射的硬件寄存器通常加volatile
- 一个中断服务程序中修改的供其他程序检测的变量。
- 多线程应用中被几个任务共享的变量。
3.4 一个变量可以既是const
还是 volatile
吗?为什么?
可以,说明这个变量不能被编译器优化且不能修改
3.5 思考一下下面那个方式更好?
#define dPS struct s *
typedef struct s * dPS;
答案是typedef,举一个例子,dPS p1,p2
; 使用define和struct的dps得到的结果是不一样的
四、关于一个常见的位运算问题
给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。
#define BIT3 (0x01<<3)
Void set_bit3(int a)
{
a|=BIT3;
}
Void clear_bit3(int a)
{
a &= ~BIT3;
}
五、关于一个常见的数据类型问题
下面的代码输出是什么,为什么?
Void foo(void)
{
unsigned int a = 6;
int b = -20;
if(a + b> 6)
printf(">6"));
else
printf("<6");
}
答案是 >6
, 是因为无符号类型与有符号类型运算是都会转化为无符号类型,而负数转化为无符号时,由是是补码储存,转换为无符号数时,这个数会非常打