C程序开发面试经典题(一)

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);

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
嵌入式软件开发经典面试通常涉及到以下几个方面。 首先,嵌入式系统的硬件平台是什么? 嵌入式系统硬件平台根据不同的应用场景有所不同,一般包括处理器、存储器、输入输出设备等。面试官可能会问到一些常见的处理器架构,如ARM、MIPS、x86等,还可能会问到不同的存储器类型以及各自的特点。 其次,嵌入式系统的软件开发有哪些关键技术? 嵌入式系统开发离不开操作系统、驱动程序以及应用程序的开发。面试官可能会问到一些常用的嵌入式操作系统,如Linux、RTOS等,还可能会问到一些常见的通信协议,如UART、SPI、I2C等。 再次,如何进行嵌入式软件的调试和测试? 嵌入式软件的调试和测试是开发过程中不可或缺的环节。面试官可能会询问一些调试技巧和常用的调试工具,如JTAG调试器、逻辑分析仪等。同时,他们也可能会问到如何进行回归测试、性能测试和集成测试等。 最后,如何进行嵌入式系统的功耗优化? 嵌入式系统的功耗优化对于很多电池供电的设备而言至关重要。面试官可能会问到一些功耗优化的方法和技巧,如选择合适的处理器频率、使用低功耗模式、优化算法等。 总之,面试官在嵌入式软件开发领域可能会问到的问涉及到硬件平台、关键技术、调试测试和功耗优化等方面。了解这些知识并做好准备可以提高面试的成功率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值