目录
6.想对一个文本文件的尾部追加写入,应当在fopen语句中使用的文件操作方式指示符号为____?
13.请说明总线接口UART、USB、SPI、IIC的异同点。
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.请说明总线接口UART、USB、SPI、IIC的异同点。
总线接口 | 串/并 | 同步/异步 | 工作方式 | 速率 | 线路 | 距离 | 大小端 |
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)联合体所有成员共用一块内存空间,并且同时只有一个成员可以得到这块内存的使用 权。一个联合体变量的总长度应至少能容纳最大的成员变量,且需要进行内存补齐。