嵌入式软件工程师经典面试题(一)
昨天发的推文中的这个面试题有点问题。通常,我都会在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、考察整数溢出
int foo(void)
{
int i;
char c=0x80;
i=c;
if(i>0)
{
return 1;
}
else
{
return 2;
}
}
返回值为2;因为i等于c等于-128;如果c等于0x7f,则i等于c等于127。因为0x80超出了char的范围(-128~127),发生了上溢。这个知识点可查阅往期笔记:【C语言笔记】整数溢出
5、考察有符号数与无符号数的运算
#include <stdio.h>
int main(void)
{
unsigned int a = 6;
int b = -20;
if ( a+b > 6 )
printf("a+b大于6\n");
else
printf("a+b小于6\n");
return 0;
}
结果为: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语言笔记】操作位的技巧
#define BIT3 (0x1<<3)
static int a;
// 将 a 的第 3 位置一
void set_bit3(void)
{
a |= BIT3;
}
// 将 a 的第 3 位清零
void clear_bit3(void)
{
a &= ~BIT3;
}
转发、点在看就是对小编最大的支持!
猜你喜欢