1、嵌入式软件工程师笔试题嵌入式软件工程师笔试题 1、将一个字符串逆序 2、将一个链表逆序 3、计算一个字节里(byte)里面有多少bit被置1 4、搜索给定的字节(byte) 5、在一个字符串中找到可能的最长的子字符串 6、字符串转换为整数 7、整数转换为字符串1、c51单片机的串口异步通信和同步通信的区别,说说他们的优缺点。2、C51单片机的数据总线和地址总线是如何复用的,说明原理。3、C51单片机的绝对寻址范围是多少k?4、说明下面的寻址方式 (1)MOV A , #30H (2)MOV A,R0(3)ADD A , R4 (4)MOV A+DPTR5、写出下面分别是什么指针? (1)int
2、 *a10; (2)int (*a)10;(3)int (*P)(int); (4)int (*a10)(int);6、void swap(int a,int b)int temp;temp = a;a=b;b=temp;main(void)int x=3,y=4;swap(x,y);问 上面程序执行完后 x= ?,y=?7、typedef struct test int i; short s; char c; union int a; short b;example ;int y ;y = sizeof(example);请问在TC环境下,y=?8、编程实现数组的逆置,例如,“hello,w
3、orld!” 逆置后为“!dlrow,olleh”。9、你认为嵌入式操作系统包括哪些部分?说说实时操作系统有哪些特点。10、冯诺依曼结构的计算机由哪几部分组成?11、说说程序,进程,线程的区别。12、说说你怎样理解 程序 = 数据 + 结构 + 算法13、根据函数原型编程实现 一个数组,按从大到小的冒泡排序。 void tibbule(int a,int n);/a为数组,n为数组长度14、OSI有哪几层?tcp/ip包括哪几层?15、编程实现一个双链表的节点插入和删除。5。写一个数据类型:一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数。6。嵌入式系统总是要用
4、户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。7。嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。8。字符串倒序。9。float a,b,c 问下列两个的值: (a+b)+c = (b+a)+c (a+b)+c = (a+c)+b10。关键字static的作用是什么? 关键字const有什么含意?11。关键字volatile有什么含意?并给出三个不同的例
5、子。 1)一个参数既可以是const还可以是volatile吗?解释为什么。 2) 一个指针可以是volatile 吗?解释为什么。 3)下面的函数有什么错误:int square(volatile int *ptr) return *ptr * *ptr;12。嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。13。动态内存分配下面的代码片段的输出是什么,为什么?char *ptr;if (ptr = (char *)malloc(0) = NULL) p
6、uts(Got a null pointer);else puts(Got a valid pointer);14。Typedef 在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子:#define dPS struct s *typedef struct s * tPS;以上两种情况的意图都是要定义dPS 和 tPS 作为一个指向结构s指针。哪种方法更好呢?(如果有的话)为什么?15。中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展让标准C支持中断。具代表事实是,产生了一个新的关键字 _interrupt。下面的代码
7、就使用了_interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。_interrupt double compute_area (double radius) double area = PI * radius * radius; printf(nArea = %f, area); return area;16。下面的代码输出是什么,为什么?void foo(void) unsigned int a = 6; int b = -20; (a+b 6) ? puts( 6) : puts(0) if (n%2 = 1) val = val *x;val = val *
8、 foo(x*x , n/2);return val;这段代码对x和n完成什么样的功能(操作)?(a) xn (x的n次幂)(b) x*n(x与n的乘积)(c) nx(n的x次幂)(d) 以上均不是第4题:考查指针,这道题只适合于那些特别细心且对指针和数组有深入理解的人main() int a5 = 1,2,3,4,5;int *ptr = (int*)(&a+1);printf(%d %d , *(a+1), *(ptr-1);这段程序的输出是:(a) 2 2(b) 2 1(c) 2 5(d) 以上均不是第5题:考查多维数组与指针void foo(int 3); main()int a 33
9、= 1,2,3 , 4,5,6,7,8,9;foo(a);printf(%d , a21);void foo(int b3) + b;b11 =9;这段程序的输出是:(a) 8(b) 9(c) 7(d)以上均不对第6题:考查逗号表达式main()int a, b,c, d;a=3;b=5;c=a,b;d=(a,b);printf(c=%d ,c);printf(d=%d ,d);这段程序的输出是:(a) c=3 d=3(b) c=5 d=3(c) c=3 d=5(d) c=5 d=5第7题:考查指针数组main()int a3 = 1,2,3 ,4,5,6;int (*ptr)3 = a;pr
10、intf(%d %d , (*ptr)1, (*ptr)2);+ptr;printf(%d %d , (*ptr)1, (*ptr)2);这段程序的输出是:(a) 2 3 5 6(b) 2 3 4 5(c) 4 5 0 0(d) 以上均不对第8题:考查函数指针int *f1(void)int x =10;return(&x);int *f2(void)int*ptr;*ptr =10;return ptr;int *f3(void)int *ptr;ptr=(int*) malloc(sizeof(int);return ptr;上面这3个函数哪一个最可能引起指针方面的问题(a) 只有 f3(
11、b) 只有f1 and f3(c) 只有f1 and f2(d) f1 , f2 ,f3第9题:考查自加操作(+)main()int i=3;int j;j = sizeof(+i+ +i);printf(i=%d j=%d, i ,j);这段程序的输出是:(a) i=4 j=2(b) i=3 j=2(c) i=3 j=4(d) i=3 j=6第10题:考查形式参数, 实际参数, 指针和数组void f1(int *, int); void f2(int *, int); void(*p2) (int *, int);main()int a;int b;p0 = f1;p1 = f2;a=3;
12、b=5;p0(&a, b);printf(%dt %dt, a, b);p1(&a, b);printf(%dt %dt, a, b);void f1(int* p , int q)int tmp;tmp =*p;*p = q;q= tmp;void f2(int* p , int q)int tmp;tmp =*p;*p = q;q= tmp; 这段程序的输出是:(a) 5 5 5 5(b) 3 5 3 5(c) 5 3 5 3(d) 3 3 3 3第11题:考查自减操作(-)void e(int ); main()int a;a=3;e(a);void e(int n)if(n0)e(-n
13、);printf(%d, n);e(-n);这段程序的输出是:(a) 0 1 2 0(b) 0 1 2 1(c) 1 2 0 1(d) 0 2 1 1第12题:考查typedef类型定义,函数指针typedef int (*test) ( float * , float*)test tmp;tmp 的类型是(a) 函数的指针, 该函数以两个指向浮点数(float)的指针(pointer)作为参数(arguments)Pointer to function of having two arguments that is pointer to float(b) 整型(c) 函数的指针, 该函数以两
14、个指向浮点数(float)的指针(pointer)作为参数(arguments),并且函数的返回值类型是整型Pointer to function having two argument that is pointer to float and return int(d) 以上都不是第13题:数组与指针的区别与联系main()char p;char buf10 = 1,2,3,4,5,6,9,8;p = (buf+1)5;printf(%d , p);这段程序的输出是:(a) 5(b) 6(c) 9(d) 以上都不对第14题: 考查指针数组的指针void f(char*);main()char
15、 * argv = ab ,cd , ef ,gh, ij ,kl ;f( argv );void f( char *p )char* t;t= (p+= sizeof(int)-1;printf( %s , t);这段程序的输出是:(a) ab(b) cd(c) ef(d) gh第15题:此题考查的是C的变长参数,就像标准函数库里printf()那样,这个话题一般国内大学课堂是不会讲到的,不会情有可原#include int ripple ( int , );main()int num;num = ripple ( 3, 5,7);printf( %d , num);int ripple (
16、int n, )int i , j;int k; va_list p;k= 0;j = 1;va_start(p, n); for (; ji = va_arg(p , int);for (; i; i &=i-1 )+k;return k;这段程序的输出是:(a) 7(b) 6(c) 5(d) 3第16题:考查静态变量的知识int counter (int i)static int count =0;count = count +i;return (count );main()int i , j;for (i=0; i 0)if (n%2 = 1) product = product*val
17、; /*如果是奇数次幂, x(val)要先乘上一次,; 偶数次幂, 最后返回时才会到这里乘以1*/val = val* val; n = n/2; return product;/* 用二元复乘策略 */算法描述(while n0) if next most significant binary digit of n( power) is onethen multiply accumulated product by current val, reduce n(power) sequence by a factor of two using integer division.get next
18、val by multiply current value of itself 第4题: (c)a的类型是一个整型数组,它有5个成员。&a的类型是一个整型数组的指针, 所以&a + 1指向的地方等同于a6, 所以*(a+1) 等同于a1ptr等同a6, ptr-1就等同与a5第5题: (b)题目自身就给了足够的提示b00 = 4b10 = 7第6题: (c)考查逗号表达式,逗号表达式的优先级是很低的, 比 赋值(=)的优先级 低. 逗号表达式的值就是最后一个元素的值逗号表达式的还有一个作用就是分割函数的参数列表.E1, E2, ., En上面这个表示式的左右是,E1, E2,. En的值被分别
19、计算出来, En计算出来的结构赋给整个逗号表达式 c=a,b; / *yields c=a* /d=(a,b); /* d =b */第7题: (a)ptr是一个数组的指针, 该数组有3个int成员第8题: (c)f1显然有问题, 它返回一个局部变量的指针, 局部变量是保存在stack中的,退出函数后, 局部变量就销毁了, 保留其指针没有意义, 因为其指向的stack空间可能被其他变量覆盖了f2也有问题, ptr是局部变量, 未初始化, 它的值是未知的, *ptr不知道指向哪里了, 直接给*ptr赋值可能会覆盖重要的系统变量, 这就是通常说的野指针的一种第9题: (b)sizeof 操作符给出其操作数需要占用的空间大小, 它是在编译时就可确定的, 所以其操作数即使是一个表达式, 也不需要在运行时进行计算.( +i + + i )是不会执行的, 所以i的值还是3第10题: (a)很显然选a.f1交换*p 和 q的值, f1执行完后, *p 和 q的值的确交换了, 但q的改变不会影响到b的改变, *p 实际上就是a 所以执行f1后, a=b=5这道题考查的知识范围很广,包括typedef自定义类型,函数指针,指针数组void(*p 2 ) ( int *, int);定义了一个函数指针的数组p,p有两个指针元素. 元素是函数的指针, 函数指针指向的函数是一个带2个参数,返回voi
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1