【03】厦门立林科技——立林科技 嵌入式 校招笔试,题目记录及解析

发布于:2025-08-13 ⋅ 阅读:(20) ⋅ 点赞:(0)

厦门立林科技——立林科技 嵌入式 校招笔试,题目记录及解析

厦门立林科技——立林科技 嵌入式 校招笔试,题目记录及解析

1.下面的程序的输出是()。

#include <stdio.h
#define ADD(X) X+X
void main()
{
	int m = 1, n = 2, k = 3, sum;
	sum = ADD(m + n) * k; 
	printf(" %d\n", sum);
}
A: 19
B:9
C:12
D:10
D

对比宏定义加括号 和 不加括号
ADD(X) X+X 和 ADD(X) (X)+(X)

#define ADD(X) X+X
ADD(m + n) * k = X + X * k =  1 + 2 + 1 + 2 * 3 = 4 + 6 = 10
#define ADD(X) (X)+(X)
ADD(m + n) *  k = X + X * k =1+2+1+2* 3 = 3+3*3 = 12

在这里插入图片描述

在这里插入图片描述

2.在头文件中#ifndef/#define/#endif的作用是

A:让编译器认为该文件为头文什
B:避免头文件重复包含
C:C语言强制规定并无实际意乂
D:以上都不对
B 

1. 作用
防止头文件被重复引用,防止被重复编译。

2. 简介
#ifndef 它是if not define的简写,是宏定义的一种,确切的说是预处理功能(宏定义、文件包含、条件编译)三种中的一种——条件编译。

使用#ifndef可以避免以下错误:如果在.h文件中定义了全局变量,一个C文件包含了.h文件多次,如果不加#ifndef宏定义,会出现变量重复定义的错误;如果加了#ifndef则不会出现这种错误.

4.执行下面程序中的输出语句后,输出的结果是()

#include <stdio.h>
void main()
{
	int i, j;
	i = 0x10; //hex(10) = Dec(16);
	j = 17;
	printf("“%d,%d\n", i - j, i + j);
}
A  1,32
B -1,32
C 1,33
D -1,33
i = 0x10; //hex(10) = Dec(16);
D

6.在32位处理器上,运行如下程序后p的值为()。

unsigned long *p =(unsigned long *)0x80001000;
*p = 0x10001234;
 p += 5;
A:Ox10001248
B:0x80001005
C:0x80001014

运行出错,p地址冲突;
应该是 A或 C,或者 D 选项,报错
在这里插入图片描述

如果
unsigned long *p =(unsigned long *)0x80001000;
 p += 5;
 结果:0x80001000 + 4*5 = 0x80001014  //注意 4*5 = 20 十六进制是14 

在这里插入图片描述

如果
unsigned long *p = 0x10001234;
 p += 5;
 结果:0x10001234+ 4*5 = 0x10001234 +14 = 0x10001248 //注意 4*5 = 20 十六进制是14 

在这里插入图片描述

10.设有两字符串“Beijing".“China"分别存放在字符串数组str1[15], str2[15]中,下面语句中能把“China”连接到Beijing”之后的为()。

A: strcpy(str1, str2);
B: strcpy(str1, “China");
C: strcat(str1, "China");
D: strcat("Beijing". str2);
C

strcat(str1, “China”);// strcat(str1,str2);
在这里插入图片描述

12.若已定义char s[10];测则在下面表达式中表示s[1]的地址有误的是

A: &s[1]
B: &s[0] + 1
C: s +1
D: S++
D

测试

void main()
{
	char s[5] = {1,2,3,4,5};
	char* p = &s[1];
	char* q = &s[0] + 1;
	char* k = s + 1;
	char* j = s++;
	printf(" %p\n", p);
	printf(" %p\n", q);
	printf(" %p\n", k);
	//printf(" %p\n", j);
}

在这里插入图片描述
在这里插入图片描述

14.执行下面程序,运行结果是()。

char* s = "abcde";
s += 2;
printf("%s",s);
A:字符’c的地址
B:不确定
C: cde
D:字符c'
C

15.设有程序段:char s[] =“china";char *p; p = s;则下面叙述正确的是()。

A: *p与s[0]相等
B: 数组s中的内容和指针变量p中的内容相等O
C: s数组长度和p所指向的字符串长度相等
D: s和p完全相同
A B C
void main()
{
	char s[10] = "china";
	char* p;
	p = s;

	printf("  *p = %c\n", *p);
	printf("s[0] = %c\n", s[0]);
	printf("p = %s\n", p);
	printf("s = %s\n", s);

	printf("\nstrlen(s) = %d\n", strlen(s));//s数组长度
	printf("strlen(p) = %d\n", strlen(p));//p所指向的字符串长度
	printf("sizeof(s) = %d\n", sizeof(s));//s数组占用空间大小,包含结束符,若定长是容量
	printf("sizeof(p) = %d\n", sizeof(p));//指针占用空间大小
}

在这里插入图片描述
strlen,求字符串长度,即字符个数;
sizeof,求字符串空间大小= 个数 * 单位字节数;

	int a[] = {1,2,3};
	int b[10] = {1,2,3};
	
	printf("\nsizeof(a) = %d\n", sizeof(a));//s数组占用空间大小(可理解数组容量)
	printf("sizeof(b) = %d\n", sizeof(b));s数组占用空间大小,若定长是容量

在这里插入图片描述

重要问题 无论什么时候都不要在main外面初始化,除非声明并初始化

变量定义到外面 p =s就报错;
变量定义到 main里面就可以运行;
为什么?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

无论什么时候都不要在main外面初始化,除非声明并初始化;

验证发现,确实如此;
在这里插入图片描述
如果要在main外面初始化,那么在声明的时候就初始化,声明和赋值不能写成两行;

char s[10] = "china";
char* p = s;
int a = 120;
void main(){}

“我觉得应该和代码的执行顺序有关,函数外,只负责分配内存,不负责执行任何东西,你的p = s;压根就没执行,因为main才是程序执行的入口”

“跟全局变量和局部变量 存储位置有吧? ”

C语言中局部变量存在栈里,全局变量存静态存储区。

局部变量空间上分配,这个局部变量所在的函数被多次调用时,每次调用这个局部变量在栈上的位置都不一定相同。局部变量也可以在堆上动态分配,但是记得使用完这个堆空间后要释放之。

全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不动态地进行分配和释放;

16.已有函数max(a, b),为了使函数指针变量p指向函数max,正确的赋值方法是()。

A: *p = max(a, b);
B: *p = max;
C:p = max;
D:p = max(a, b);
C

函数指针示例

int max(int a, int b) {
	return  a > b ? a : b;
}

void main()
{
	//定义函数指针
	int (*p)(int a, int b);

	//赋值,函数指针变量p指向函数max
	p = max;

	//调用
	printf("(*p)(5,8) = %d\n",(*p)(5,8));	
}

在这里插入图片描述

17.在32位处理器下执行以下程序,以下选项正确的是()。

char code[]="Hello world!";
char *p = code;
long a = 1000;
int n = 10;
A : sizeof(code) == 11
B : sizeof( p ) == 12
C : sizeof(a) == sizeof(n)
D : 以上都不对
C

在这里插入图片描述
long是长整型 long int的缩写形式,int是整型。
后者包含前者,前者是后者的一种类型。所以说他俩没区别,但又有点小不一样。
写代码的时候用int,是默认,用long是专门标注强调,另外,long还分有无符号。
就好比去吃早点,不强调不吃芫荽,店家可能就会默认给你放上。

long和int在不同环境的编译器下需要的存储大小不同。
在这里插入图片描述

32位机中,
char1个字节
short2个字节
int4个字节
long4个字节

64位机中,
char1个字节
short2个字节
int4个字节
long8个字节 //但是,我在64位系统,x86,x64编译都是4
void main()
{
	char a = 10;
	short b = 10;
	int c = 10;
	long d = 1000;
	float e = 12;
	double f = 5;
	
	printf("  char %d\n", sizeof(a));
	printf(" short %d\n", sizeof(b));
	printf("   int %d\n", sizeof(c));
	printf("  long %d\n", sizeof(d));
	printf(" float %d\n", sizeof(e));
	printf("double %d\n", sizeof(f));
}

64位系统,x86编译
在这里插入图片描述
64位系统,x64编译
在这里插入图片描述

18.定义一个函数实现交换x和y的谊,并将结果正确返回。能够实现此功能的是

//A
swapa(int x, int y) {
	int temp;
	temp = x;
	x = y;
	y = temp;
}

//B
swapb(int* x, int* y)
{
	int temp;
	temp = x;
	x = y;
	y = temp;
}

//C
swapc(int* x, int* y) {
	int temp;
	temp = *x;
	*x = *y;
	*y = temp;
}

//D
swapd(int *x, int *y){
	int* temp;
	temp = x;
	x = y;
	y = temp;
}

C
void main()
{
	int a = 5, b = 9;
	swapa(a, b);
	printf("%d,%d\n", a, b);

	int c = 5, d = 9;
	swapb(&c, &d);
	printf("%d,%d\n", c, d);

	int e = 5, f = 9;
	swapc(&e, &f);
	printf("%d,%d\n", e, f);

	int g = 5, h = 9;
	swapd(&g, &h);
	printf("%d,%d\n", g,h);
}

在这里插入图片描述

(1)将指针作为实参,可以对该指针指向的对象,也就是实参进行修改

void swap2(int *n1, int *n2)
{
    int tmp;
    tmp = *n1;
    *n1 = *n2;
    *n2 = tmp;    
} 
swap(&a,&b);

使用引用形参达到目的

void swap(int &x, int &y)
{
    int t;
    t=x;
    x=y;
    y=t;
}
swap(&a,&b);

引用方式出错
在这里插入图片描述

19.对以下代码理解正确的是()。

(1) char *p = malloc(5);
(2) memcpy(p, "123456", 5);
(3) strcpy(p, "123456");
(4) free(p);*p=1;

A:(2)会导敌指针越界
B:(3)会导致指针计越界
C:(4)必然会使系统死机
D:以上都确

D 

21.执行下面程序,运行结果是

#include <stdio.h>
long fib(int n){
	if (n > 2) {
		return (fib(n - 1) + fib(n - 2));
	}
	else {
		return 2;
	}
}
void main(){
	printf("%din", fib(3));
}
A: 2
B: 4
C: 6
D: 8

在这里插入图片描述

23.执行下面程序运行结果是

#include<stdio.h>
int w =3;
int fun(int k){
	if (k ==0)return w; 
	return (fun(k-1)* k); //阶乘
}
void main()
{
int w=10;
printf("%dIn", fun(5)*w);
}
A 360
B 3600
C 1080
D 1200

在这里插入图片描述

n*(n-1),
直到 n=1时,f(n-1) = f(0), return w; w=3;
即,fun(5) = 5*4*3*2*1*3 = 120*3;
fun(5)*w = 360 *10 = 3600;

25.在32位的处理器上,定义以下结构体,则语句printf(“%d”,sizdof(struct s);的输出结果是) 。

struct s{
	int a;
	char b;
	float f;
};

四字节对齐

12

26.在32位ARM处理器上,执行如下程度,输出结果为()。

typedef struct {
	char a;
	int b;
	char c;
	int d;
}_str_1_t;

typedef struct {
	char a;
	char c;
	int b;
	int d;
}_str_2_t;

printf("%d,%d", sizeof(_str_1_t), sizeof(_str_2_t));
16,12

在这里插入图片描述
64位也是16,12
在这里插入图片描述

27.有以下说明,则值为210的表达式是()

int x0[] = { 110, 120 }, x1[] = { 210, 220 };

struct s x[] = { {100}, {200} }, *p= x;

x[0].b = x0;
x[1].b = x1;

A: *p->b
B: (++p)->a
C: *(p++)->b
D: *(++p)->b
D

31.域名服务DNS的正向解析是().

A将域名转换为物理地址.
B将域名转换为为IP地址
CIP地址转换为物理地址
D:将IP也转专换为域名
B 

1、DNS的作用
正向解析:根据域名查找对应的IP地址
反向解析:根据IP地址查找对应的域名

DNS系统的分布式数据结构
在这里插入图片描述

2、DNS概述
在日常生活中人们习惯使用域名访问服务器,但机器间互相只认IP地址,域名与IP地址之间是多对一的关系,一个Ip地址不一定只对应一个域名,且一个域名只可以对应一个Ip地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,整个过程是自动进行的。

32.TCP和UDP协议的相似之处是。

A:都是面向连接的协议
B:邹是面向上连接的协议
C传输层协议
D以均不对
D 

33.以下用于文件传输的协议是()。

A: HTML
B: SMTP
C: FTP
D: POP
C 

FTP协议用于文件传输。

FTP是File Transfer Protoco文件传输协议的缩写,FTP用于在网络上进行文件传输的一套标准协议,使用客户/服务器模式。它属于网络传输协议的应用层。文件传送和文件访问之间的区别在于:前者由FTP提供,后者由如NFS等应用系统提供。

FTP协议能操作任何类型的文件而不需要进一步处理,就像MIME或Unicode一样。但是,FTP有着极高的延时,这意味着,从开始请求到第一次接收需求数据之间的时间,会非常长;并且不时的必须执行一些冗长的登录进程。

34.对于下列说法,错误的是。

A: TCP协议可以提供可靠的数据流传输服务
B:TCP协议可以提供面向连接的数据流传输服务
C:TCP协议可以提供全双工的数据流传输服务
D:TCP协议可以提供面向非连接的数据流传输服务
D

35.在以太网中实现IP地址到MAC地址的解析,主要通过()协议实现。

A: RTP
B: ARP
C: IGMP
D: ICMP
B

ARP协议 Address Resolution Protocol 地址解析协议

36.linux所有服务的启动脚本都存放在()目录中。

A: /boot
B: /etc/init.d
C:/opt
D: /proc/sys
B

38.以下对信号的理解不正确的是()。

A:信号是一种异步通信方式
B:信号只用在用户空间进程通信,不能和内核空间交互
C:信号是可以被屏蔽的
D:信号是通过软中断实现的
B 

43.以下关于UART描术正确的

A:全双工、异步通信方式
B:半双工、同步通信方式
C:全双工、同步通信方式
D:半双工、异步通信方式
A
全双工、异步;
TX发送端、RX接收端;
UART空闲状态通常保持在高电平,起始位给一个低电平,然后读取数据,停止位给一个高电平。

44.执行以下程序段,*c的结果是()

char test[10] ={0,1,2,3,4,5,6,7,8, 9};
short *a = test;
a++;//short加2字节
int *b =a;
b++;//int加4字节
unsigned char *c=b;
c++;//char加1字节
A:7
B:6
C:2
D: 8

共,加加7字节,c= a+7

A
	64位系统,x64,x86运行结果一样
	printf("%d\n",*c);	
	printf("%p\n", test);
	printf("%p\n", a);//short加2字节
	printf("%p\n", b);//int加4字节
	printf("%p\n", c);//char加1字节

在这里插入图片描述
在这里插入图片描述

45.在stm32单片机中,以下对中断理解正确的是()。

A:GPIO无法产生中断
B:多个中断同时产生采取随机进入中断函数的方式
C:在main函数的while中执行某个函数时产生中断,需等到该函数执行完中断函数中执行
D:在中断处理函数中尽量不要处理比较复杂的逻辑
D 

46.使用DMA技术的目的是()。

A:解决CPU和主存之间的速度匹配问题
B:I/O设备相互之间可实现并行工作
C:解放CPU,提高资源利用率
D:可实现低速IO设备与主存直接交换信息
A

简单地说是:控制是硬盘内部的控制读写,这样有利于减轻CPU负担,加快读取速度。

复杂点,专业点:
Direct Memory Access(存储器直接访问)。这是指一种高速的数据传输操作,允许在外部设备和存储器之间直接读写数据,既不通过CPU,也不需要CPU干预。整个数据传输操作在一个称为"DMA控制器"的控制下进行的。CPU除了在数据传输开始和结束时做一点处理外,在传输过程中CPU可以进行其他的工作。这样,在大部分时间里,CPU和输入输出都处于并行操作。因此,使整个计算机系统的效率大大提高。

47.指令周期是指()。

A: CPU从主存取出一条指令的时间
B: CPU执行一条指令的时间
C:CPU从主存取一条指令加CPU执行这条指令的时间
D: 时钟周期时间
C

指令周期是取出一条指令并执行这条指令的时间。一般由若干个机器周期组成,是从取指令、分析指令到执行完所需的全部时间。
CPU周期 :又称机器周期,CPU访问一次内存所花的时间较长,因此用从内存读取一条指令字的最短时间来定义。
时钟周期: 通常称为节拍脉冲或T周期。一个CPU周期包含若干个时钟周期。

48.主存贮器和CPU之间增加cache的目的是()。

A:解决CPU和主存之间的速度匹配问题
B:扩大CPU中通用寄存器的数量
C:扩大主存贮器容量
D:既扩大主存贮器容量,又扩大CPU中通用寄存器的数量
A

高速缓冲存储器(Cache)是位于CPU与主存间的一种容量较小但速度很快的存储器。由于CPU的速度远高于主存,CPU直接从主存中存取数据要等待一定的时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了CPU对主存的访问效率.

49.没有外存贮器的计算机监控程序可以存放在()。

A:RAM
B:ROM
C:RAM和ROM
D:CPU
B 

50.用2条8位的数据总线传输64位二进制代码,需要传输几次()。

A:8次
B:4次
C:1次
D:2

网站公告

今日签到

点亮在社区的每一天
去签到