http://blog.csdn.net/shanshanpt/article/details/7419184
分类: 嵌入式
2017-02-09 14:49:52
这篇文章主要针对毕业不久需要找嵌入式工作的人群,如果你是大牛,麻烦你路过,我就不敢在这班门弄斧,文章主要对面试和笔试中遇到的一些问题做了一些分析,有些只代表个人见解。
(3)、数组做sizeof的参数不退化,传递给strlen就退化为指针了。
(4)、大部分编译程序,sizeof在编译时确定,因此sizeof(x)可以用来定义数组维数;而strlen要在运行时才能计算出来,用来计算字符串的长度,而不是类型占内存的大小;
char str[20]="0123456789";
int len1=strlen(str); //len1=10;
int len2=sizeof(str); //len2=20;
sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸;
如:
fun(char [8])
fun(char [])
都等价于 fun(char *)
在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小,如果想在函数内知道数组的大小, 需要这样做:
进入函数后用memcpy拷贝出来,长度由另一个形参传进去fun(unsiged char *p1, int len)常在用到 sizeof和 strlen的时候,通常是计算字符串数组的长度,如果是对指针,结果则会不一样的:
{
unsigned char* buf = new unsigned char[len+1]
memcpy(buf, p1, len);
}
char* str = "abacd";
sizeof(str)//结果 4 --->str是指向字符串常量的字符指针,sizeof 获得的是一个指针所占的空间,应该是长整型的,所以是4;
sizeof(*str) //结果 1 --->*str是第一个字符,其实就是字符串的第一位'a' 所占的内存空间,是char类型的,占了 1 位;
strlen(str)= 5 //--->若要获得这个字符串的长度,则一定要使用strlen
#define SET(a,b) a|(0x1<#define CLR(a,b) a&(~(0x1< (2)、宏定义一个求两个数最小值的函数不能使用大于、小于、if语句#define MIN(A,B) ((A)>(B))?B:A
#definemax(a,b) (((a)-(b))&(1<<31))?(b):(a)#define max(a,b) (a-b)==abs(a-b)?a:b#define max(a,b) ((((long)((a)-(b)))&0x80000000)?(b):(a))(3)、宏定义交换两个数:#define SWAP (a,b) {a=a+b; b=a-b; a=a-b; }
3、程序编译的过程
预处理:预处理相当于根据预处理命令组装成新的C程 序,不过常以i为扩展名。
编译: 将得到的i文件翻译成汇编代码。s文件。
汇编:将汇编文件翻译成机器指令,并打包成可重定位目标程序的O文件。该文件是二进制文件,字节编码是机器指令。
链接:将引用的其他O文件并入到我们程序所在的o文件中,处理得到最终的可执行文件。
4、++i和i++的区别
(1)、整形数++i和i++的区别
在例子中,第7和第8行的作用一样,仅仅是为变量i加1,这时i的值已经增加为9,接下来第10行变量a先获得i的值(即9),然后i加1,第11行变量i 先再加1,然后把得到的值赋给b,所以b的值为11。(2)、(*p)++和++(*p)的区别(3)、*p++和*++p的区别:
对于第8行的操作数p而言,*和++的优先级相同,但根据它们的右结合性可知,在这个表达式里可认为++的优先级高于*,即*p++等价于*(p++)。
而对于第10行的操作数p而言,它只有一个运算符++,所以先计算++p得出结果,然后间接运算。
5、二分法的实现过程和代码分析
二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进 行遍 历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为 O(lgn),譬如数组{1,2,3,4 ,5,6,7, 8,9},查找元素6,用二分查找的算法执行的话,其顺序为: (1)、第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找, (2)、寻找{6, 7, 8, 9}的中位数,为7,7>6,则6应该在7左边的数组元素中,那么只剩下6,即找到了。
代码:
6、大端小端的转换
0x3132(0x32是低位,0x31是高位),把它赋值给一个short变量,那么它在内存中的存储可能有如下两种情况:(1)、大端字节(Big-endian):----------------->>>>>>>>内存地址增大方向short变量地址0x1000 0x1001_____________________________ | | | 0x31 | 0x32 |_______________|________________高位字节在低位字节的前面,也就是高位在内存地址低的一端.可以这样记住(大端->高位->在前->正常的逻辑顺序)(2)、小端字节(little-endian):----------------->>>>>>>>内存地址增大方向short变量地址0x1000 0x1001_____________________________ | | | 0x32 | 0x31 |________________|________________ 低位字节在高位字节的前面,也就是低位在内存地址低的一端.可以这样记住(小端->低位->在前->与正常逻辑顺序相反)
7、栈和堆的区别
栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。堆(操作系统):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
8、Volatile与Register修饰符的作用
Volatile与Register修饰符的作用volatile的作用是:作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值,volatile表示这个变量会被意想不到的改变,每次用他的时候都会小心的重新读取一遍,不适用寄存器保存的副本1) 并行设备的硬件寄存器(如:状态寄存器) 2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) 3) 多线程应用中被几个任务共享的变量register
建议编译器使用寄存器来优化对变量的存取
register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其 存储速度
9、char *a 与char a[] 的区别
char *a存放在常量区,是无法修的。而char a[] 是存放在栈中,是可以修改的
10、要求设置一绝对地址为0x67a9 的整型变量的值为0xaa66
int *ptr = (int *)0xaa66; *ptr = 0x67a9;
11、信号量与互斥锁的区别
(1)、互斥量用于线程的互斥,信号量用于线程的同步。互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访 问顺序,即访问是无 序的。 同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已 经实现了互斥,特别 是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源(2)、互斥量值只能为0/1,信号量值可以为非负整数。也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个 同类资源的多线程 互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。(3)、互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。
12、用C语言实现字符串倒序
13、选择排序和冒泡排序
(1)、选择法(2)、冒泡法
14、memcpy和strcpy的区别
(1)、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。 (2)、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是 根据其第3个参数决定复制 的长度。 (3)、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
15、进程与线程的区别
(1)、地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
(2)、通信:进程间通信IPC,通过管道、信号量、消息队列、信号、套接字、共享内存通信,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
(3)、一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。
16、TCP和UDP的区别
条件TCP UDP 是否连接 面向连接 面向非连接 传输可靠性 可靠 不可靠 应用场合 传输大量数据 少量数据 速度 慢 快
TCP的可靠性:
首先,为了防止数据在传输的过程中被损坏,每个信息包都包含一个校验码,这个校验码头就是一个用来保证信息包在传输过程中没有被更改的 代码,当信息到达目的地的时候,接收方会对比较验码和收到的信息中的数据,如果校验码不对,则被信息包将被省略。
第二,为了防止信息包丢失,TCP会要求接收方每收到一个信息包都反馈一下,如果接收方没有提供反馈,发送方会自动重发一次,一直到接收方 收到为止,或者它会判断网络链接断开了,就会在程序中返回一个错误的提示。
第三,为了防止信息包重复或顺序错误,TCP每传送一个信息包都会传送一个序号,接收方会检查这个序号,确保收到该信息包,并把全部信息包 按顺序重新合并,同时,如果接收方看到一个已接收了的序号,则这个信息包就会被丢弃。
阅读(769) | 评论(0) | 转发(0) |