查看原文
其他

嵌入式软件工程师经典面试题(一)

昨天发的推文中的这个面试题有点问题。通常,我都会在makedown编辑器编辑好学习笔记,然后再通过makedown转换工具转换为公众号文章,但是没想到的是,这个转换的过程竟然出现了问题。现已修改:

1、考察数组指针

int a[10]={1,2,3,4,5,6,7,8,9,0}; 

int *p=&a[1]; 

则p[6]等于8

关于数组指针可查阅往期笔记:【实用】关于数组与指针的总结

2、考察大端模式与小端模式的概念

大端模式:高位字节数据存储在低地址 

小端模式:低位字节数据存储在低地址

3、考察定义

用变量a定义 

(1)定义一个整型数:int a; 

(2)定义一个指向整型数的指针:int *a; 

(3)定义一个指向指针的指针,它指向的指针指向一个整型数:int **a;

(4)定义一个有10个整型数的数组:int a[10]; 

(5)定义一个有10指针的数组,该指针是指向一个整型数:int *a[10]; 

(6)定义一个指向有10个整型数数组的指针:int (*a)[10]; 

(7)定义一个指向函数的指针,该函数有一个整型数参数并返回一个整型数:int (*a)(int); 

(8)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型数参数并返回一个整型:int (*a[10])(int);

4、考察整数溢出

  1. int foo(void)

  2. {

  3. int i;

  4. char c=0x80;

  5. i=c;

  6. if(i>0)

  7. {

  8. return 1;

  9. }

  10. else

  11. {

  12. return 2;

  13. }

  14. }

返回值为2;因为i等于c等于-128;如果c等于0x7f,则i等于c等于127。因为0x80超出了char的范围(-128~127),发生了上溢。这个知识点可查阅往期笔记:【C语言笔记】整数溢出

5、考察有符号数与无符号数的运算

  1. #include <stdio.h>

  2. int main(void)

  3. {

  4. unsigned int a = 6;

  5. int b = -20;


  6. if ( a+b > 6 )

  7. printf("a+b大于6\n");

  8. else

  9. printf("a+b小于6\n");


  10. return 0;

  11. }

结果为:a+b大于6。 原因是因为编译器会将有符号数b转换成为一个无符号数,即此处a+b等价于a+(unsigned int)b。该程序运行在32bit环境下,b的值为0xFFFFFFFF-20+1 = 4294967276,即a+b将远远大于6。这个知识点可查阅往期笔记:【重要】关于有符号数与无符号数的一些总结

6、考察位运算

给定一个整型变量a,写两段代码,第一个设置a的bit3,第二个清除a的bit,在以上两个操作中,要保持其它位不变。这个知识点可查阅往期笔记:【C语言笔记】操作位的技巧

  1. #define BIT3 (0x1<<3)


  2. static int a;


  3. // 将 a 的第 3 位置一

  4. void set_bit3(void)

  5. {

  6. a |= BIT3;

  7. }


  8. // 将 a 的第 3 位清零

  9. void clear_bit3(void)

  10. {

  11. a &= ~BIT3;

  12. }





转发、点在看就是对小编最大的支持!


猜你喜欢

编写优质嵌入式C程序(一)

编写优质嵌入式C程序(二)

【Linux笔记】文本文件查看命令

【Linux笔记】文件的权限

分享一个很酷的技巧

【Git笔记】分布式版本控制系统



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存