嵌入式软件面试题-套卷1

目录

1.说明关键字static的作用

2.下面是关键字const的使用示例,请说明它们的作用:

3.如下代码,最终value的值是___?

4.以下语句不能被正确赋值的是___

5.为了比较两个字符串s1和s2是否相等,应当使用__?

6.想对一个文本文件的尾部追加写入,应当在fopen语句中使用的文件操作方式指示符号为____?

7.如下代码,printf的结果为()

8.请画出一种总线时序图(IIC、UART、SPI)

9.请写出二分查找算法

10.写出一种排序算法

11.串口通讯中波特率与传输字节速率的关系换算式

12.结构体内存对齐原则?

13.请说明总线接口UART、USB、SPI、IIC的异同点。

14.结构体struct和联合体union的区别?

1.说明关键字static的作用

(1)static修饰局部变量时:①改变了其存储位置,由栈区改为静态区;②同时改变了其生命周期,为整个源程序,因此它只被初始化一次,若没显式初始化则自动初始化为0。 

(2)static修饰全局变量时:改变了其作用域,只可以被文件内所用函数访问。

(3)static修饰函数时:改变了其作用域,只可被这一文件内的其它函数调用。

2.下面是关键字const的使用示例,请说明它们的作用:

(1)const int a;           // a是一个整形常量  
   int const a;           // a是一个整形常量  
(2)const int *a;          // a是一个指向整型常量的指针变量  
   int * const a;         // a是一个指向整型变量的指针常量  
   int const * const a = &b;  // a是一个指向整型常量的指针常量  
(3)char *strcpy(char *strDest, const char *strSrc);  // 参数在函数内部不会被修改  
    const int strcmp(char *source, char *dest);     // 函数的返回值不能被修改 

 注:const放在*前是修饰指向的对象,放在*后则是修饰指针本身。

3.如下代码,最终value的值是___?

int *p1,*p2;

int value;

p1=(int *)0x400;

p2=(int *)0x408;

value=p2-p1;

 答案:2    

注:两个指针相减:并非他们的两个地址值直接做减法运算,而是两指针所指地址之间的数据个数。8/4=2;  8是地址值差值,4是int的大小

4.以下语句不能被正确赋值的是___

A:        char s1[10];s1="china";

B:        char s2[]={'c','h','i','n','a'};

C:        char s3[20]="china";

D:        char *s="china";

 答案:D

注:char *s   s是一个指向字符型变量的指针, "china"是一个字符串常量,等号左边是变量,右边是常量。类型不匹配,正确赋值应该是:const char *s="china";

5.为了比较两个字符串s1和s2是否相等,应当使用__?

A:        if(s1=s2)

B:        if(s1==s2)

C:        if(strcmp(s1,s2)==0)

D:        if(strcmp(&s1,&s2)==0)

 答案:D

注:int strcmp(const char* str1,const char *str2)   字符串类型为:char (*)[ ]  形参和实参类型要匹配

6.想对一个文本文件的尾部追加写入,应当在fopen语句中使用的文件操作方式指示符号为____?

答案  a

7.如下代码,printf的结果为()

#include <stdio.h>

#include <string>

int main()

{

        char acNew[20]="21\0";

        printf("%d\n",strlen(acNew));

        return 0;

}

答案:        2

注:strlen()函数则用来测试字符串所占字节数,不包括结束字符 ’\0’。strlen(字符数组名)得到字符串所占字节数,strlen(字符串指针名)得到字符串所占字节数。

8.请画出一种总线时序图(IIC、UART、SPI)

1)UART

2)  IIC 

3)  SPI 

9.请写出二分查找算法

#include <stdio.h>
#include <string>
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
int half(int low, int high, int key)//采用递归得方式
{
	if (low <=high)//必须小于等于形成闭环
	{
		int mid = (low + high) / 2;
		if (arr[mid] == key)return mid;
		else if (arr[mid] > key)return half(low, mid-1, key);
		else return half(mid+1, high, key);
	}
	return -1;
}
int main()
{
	int key;
	printf("请输入要查找的数字:");
	scanf("%d", &key);
	int sz = sizeof(arr) / sizeof(arr[0]);//计算数组大小
	int pos = half(0, sz - 1, key);
	printf("原数据表 :");
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n\n");
	if (pos >= 0)
	{
		printf("查找成功,在第%d个元素\n", pos + 1);//数组从0开始,所以得加1
	}
	else
		printf("查找失败!\n");
	return 0;
}

10.写出一种排序算法

1)冒泡排序

#include <stdio.h>
#include <string>
void Fun(int arr[], int sz)//冒泡排序
{
	for (int i = 0; i < sz-1; i++)
	{
		for (int j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}
int main()
{
	int arr[10] = { 0,1,2,3,4,5,6,9,8,7 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	Fun(arr, sz);
	for (int i = 0; i < sz; i++)
		printf("%d ", arr[i]);
	return 0;
}

2)选择排序

#include <stdio.h>
#include <string>
void print(int arr[], int len)
{
	for (int i = 0; i < len; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
void selectsort(int arr[],int sz)
{
	for (int i = 0; i < sz; i++)//进行n趟比较
	{
		int k = i;//k为每次比较的下标
		for (int j = i; j < sz; j++)//选出[i,sz-1]中最小的元素,更新每次比较的下标值
		{
			if (arr[j] < arr[k])k = j;
		}
		int temp = arr[k];//交换arr[k]和arr[i]
		arr[k] = arr[i];
		arr[i] = temp;
	}
}
int main()
{
	int arr[] = { 33,5,61,1,9,66 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("选择前数组的顺序:\n");
	print(arr, sz);
	selectsort(arr,sz-1);
	printf("选择排序后数组的顺序:\n");
	print(arr, sz);
	return 0;
}

3)快速排序

#include <stdio.h>
#include <string>

void print(int arr[], int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
int partition(int arr[], int left, int right)
{
	int temp = arr[left];
	while (left < right)
	{
		while ((left < right) && arr[right] > temp)right--;//反复左移right
		arr[left] = arr[right];//将arr[right]挪到arr[left]
		while ((left < right) && arr[left] <= temp)left++;//反复右移left
		arr[right] = arr[left];//将arr[left]挪到arr[right]
	}
	arr[left] =temp;//把temp放在left和right相遇的地方
	return left;
}
void quick_sort(int arr[], int left, int right)
{
	if (left < right)//保证当前区间大于1
	{
		int pos = partition(arr, left, right);
		quick_sort(arr, left, pos - 1);//对左子区间递归进行快速排序
		quick_sort(arr, pos + 1, right);//对右子区间递归进行快速排序
	}
}
int main()
{
	int arr[] = { 33,5,61,1,9,66 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("快速排序前数组的顺序:\n");
	print(arr, sz);
	quick_sort(arr, 0, sz-1);
	printf("快速排序后数组的顺序:\n");
	print(arr, sz);
	return 0;
}

11.串口通讯中波特率与传输字节速率的关系换算式

波特率和数据传输速率的关系 - 丶尘丶 - 博客园

12.结构体内存对齐原则?

答案:

1)第一个成员的首地址(地址偏移量)为0。

2)成员对齐:以4字节对齐为例,如果自身类型小于4字节,则该成员的首地址是自身类型大小的整数倍;如果自身类型大于等于4字节,则该成员的首地址是4的整数倍。若内嵌结构体,则内嵌结构体的首地址也要对齐,只不过自身类型大小用内嵌结构体的最大成员类型大小来表示。数组可以拆开看做n个数组元素,不用整体看作一个类型。

3)最后结构体总体补齐:以4字节对齐为例,如果结构体中最大成员类型小于4字节,则大小补齐为结构体中最大成员类型大小的整数倍;如果大于等于4字节,则大小补齐为4的整数倍。内嵌结构体也要补齐。

注意:32位编译器,一般默认对齐方式是4字节。

13.请说明总线接口UARTUSBSPIIIC的异同点。

总线接口

串/并

同步/异步

工作方式

速率

线路

距离

大小端

UART

串行

异步

全双工

慢,最快只有1.5Mbps

3线:RX、TX、GND

远,RS-485可达1200m

小端模式

USB

串行

同步

半双工

快,USB3.0可达5Gbps

4线:Vbus、GND、D+、D-

近,不超过5m

小端模式

SPI

串行

同步

全双工

快,可达50Mbps

3线或4线:SCLK、SIMO、SOMI、SS

远,可达10m

大端模式

IIC

串行

同步

半双工

  IIC传输位速率在标准模式下可达100Kbit/s,快速模式下可达400Kbit/s,高速模式下可达3.4Mbit/s

2线:SCL、SDA

近,不超过30cm

大端模式

14.结构体struct和联合体union的区别?

1)两者最大的区别在于内存的使用。

2)结构体各成员拥有自己的内存,各自使用且互不干涉,遵循内存对齐原则。

3)联合体所有成员共用一块内存空间,并且同时只有一个成员可以得到这块内存的使用  权。一个联合体变量的总长度应至少能容纳最大的成员变量,且需要进行内存补齐。

  • 21
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值