您的位置:首页 > 其它

笔试题(一)

2015-10-20 23:06 162 查看
华勤通讯: 驱动工程师笔试

1、 volatile 什么意思和作用

2、不开辟用于交换数据的临时空间,如何完成字符串的逆序

3、双向链表插入、删除操作

4、串行通信: 异步通讯 和 同步通讯 (两者区别)

1.同步通信要求接收端时钟频率和发送端时钟频率一致,发送端发送连续的比特流;异步通信时不要求接收端时钟和发送端时钟同步,发送端发送完一个字节后,可经过任意长的时间间隔再发送下一个字节。
2.同步通信效率高;异步通信效率较低。
3.同步通信较复杂,双方时钟的允许误差较小;异步通信简单,双方时钟可允许一定误差。
4.同步通信可用于点对多点;异步通信只适用于点对点。

5、还有头疼的 内存问题啦(GetMemory)

2、不开辟用于交换数据的临时空间,如何完成字符串的逆序

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

char * Reverse(char* s)    // s 存放str本身地址的指针,s存储的值(右值)为 0x0012ff78  ,
{                           // s左值(地址)为 0x0012ff28    ,   编译器为每个变量分配一个地址(左值)
char* r = s ;          //  r左值(地址)为 0x0012ff1c 右值0x0012ff78 "abcdefg"      存储于变量中的值(它的右值)
//令p指向字符串最后一个字符
char* p = s;           // p 左值 0x12ff18 ,右值 0x12ff78
while (*(p + 1) != '\0') // 当 P+1 = '\0'的时,p 指向了 0x0012ff7e ‘g’,跳出循环。
++p ;
// 使用异或操作进行交换
while (p > s)
{
*p = *p ^ *s ;
*s = *p ^ *s ;
*p = *p-- ^ *s++ ;
}
return r ;

}

int main()
{
char str[] = "abcdefg";
printf("strSource=%s\n", str);
Reverse(str);
printf("strResult=%s \n", str);

}


// str是数组名,它是一个常指针,所以地址固定,有右值,也就是a[0],即 a ,作为左值,但是不允许被赋值,不信,可以试一试啊,写一个 str='c';看看果然不行, str 相当于 &str 你这样看来看,怎么可以 把 'c' 赋值给 str(地址) 呢

对于异或操作,上面的看不懂,怎么就完成交换了呢??

当然 下面的 代码 更加简洁,明了

#include<stdio.h>
#include<string.h>
reverse(char *p);
int main()
{
char a[]="ABCDEFGHIJ";
puts(a);
reverse(a);
puts(a);

}
/* 具体思路是这样的,首先指针指向数组a首地址,ptr 为字符串末尾地址,要考虑越界所以要 -1  */
reverse(char *p)
{
int i,j;
char *ptr;
char temp;
i=strlen(p);
ptr=p+i-1;   // 这里开始写成 ptr=ptr+i,出现错误的,
j=i;            //易错点,这里我们可以好好看看 C primer plus P259 程序 清单10.11

for(j=0;j<(i/2);j++)  // 如果i=10,j<5;  // 哇,看了上面的代码 发现自己好SB
{  temp=*p;
*p=*ptr;
*ptr=temp;
p + +;
ptr - -;
}
}


切记: main() 函数里面的 是 数组,可不能写成 指针 *p="abcdf" ;

面试经历:

问题:

1、推挽输出和开漏输出 区别

2、实时性操作系统 和 非实时操作系统区别

3、中断讲解

4、(0x11 || 0x00)==1 不是 0x11 ,尼玛真丢人啊,人家要你的理由是什么

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: