1.请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1 int checkCPU( ) {
{
union w
{
int a;
char b;
} c;
c.a = 1;
return (c.b ==1);
}
}
答案:嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节, Big-endian 模式的CPU对操作数的存放方式是从高字节到低字节。 在弄清楚这个之前要弄清楚这个问题: 字节从右到坐为从高到低! 假设从地址0x4000开始存放: 0x12345678,是也个32位四个字节的数据,最高字节是0x12,最低字节是0x78: 在Little-endian模式CPU内存中的存放方式为: (高字节在高地址, 低字节在低地址)
内存地址0x4000 0x4001 0x4002 0x4003
存放内容 0x78 0x56 0x34 0x12
大端机则相反。
有的处理器系统采用了小端方式进行数据存放,如Intel的奔腾。有的处理器系统采用了大端方式进行数据存放,如IBM半导体和Freescale的PowerPC处理器。不仅对于处理器,一些外设的设计中也存在着使用大端或者小端进行数据存放的选择。 因此在一个处理器系统中,有可能存在大端和小端模式同时存在的现象。这一现象为系统的软硬件设计带来了不小的麻烦,这要求系统设计工程师,必须深入理解大端和小端模式的差别。大端与小端模式的差别体现在一个处理器的寄存器,指令集,系统总线等各个层次中。 联合体union的存放顺序是所有成员都从低地址开始存放的。 以上是网上的原文。让我们看看在ARM处理器上union是如何存储的呢? 地址A —————- |A |A+1 |A+2 |A+3 |int a; | | | | ——————– |A |char b; | | ——— 如果是小端如何存储c.a的呢?
地址A ———–
——————- |A |A+1 |A+2 |A+3 | int a;
|0x01 |0x00 |0x00 |0x00 | ————————————- |A |char b; | | ———
如果是大端如何存储c.a的呢?
地址A ———————
——— |A |A+1 |A+2 |A+3 |int a; |0x00 |0x00 |0x00 |0x01 | —————————————— |A |char b; | | ——— 现在知道为什么c.b==0的话是大端,c.b==1的话就是小端了吧。
2.堆和栈上的指针
答案:指针所指向的这块内存是在哪里分配的,在堆上称为堆上的指针,在栈上为栈上的指针.
在堆上的指针,可以保存在全局数据结构中,供不同函数使用访问同一块内存.
在栈上的指针,在函数退出后,该内存即不可访问.
3.什么是指针的释放?
答案:具体来说包括两个概念.
1 释放该指针指向的内存,只有堆上的内存才需要我们手工释放,栈上不需要.
2 将该指针重定向为NULL.
4.数据结构中的指针?
答案:其实就是指向一块内存的地址,通过指针传递,可实现复杂的内存访问.
5.函数指针?
答案:指向一块函数的入口地址.
6.指针作为函数的参数?
答案:比如指向一个复杂数据结构的指针作为函数变量
这种方法避免整个复杂数据类型内存的压栈出栈操作,提高效率.
注意:指针本身不可变,但指针指向的数据结构可以改变.
7.指向指针的指针?
答案:指针指向的变量是一个指针,即具体内容为一个指针的值,是一个地址.
此时指针指向的变量长度也是4位.
8.指针与地址的区别?
答案:区别:
1指针意味着已经有一个指针变量存在,他的值是一个地址,指针变量本身也存放在一个长度为四个字节的地址当中,而地址概念本身并不代表有任何变量存在.
2 指针的值,如果没有限制,通常是可以变化的,也可以指向另外一个地址.
地址表示内存空间的一个位置点,他是用来赋给指针的,地址本身是没有大小概念,指针指向变量的大小,取决于地址后面存放的变量类型.
9.指针与数组名的关系?
答案:其值都是一个地址,但前者是可以移动的,后者是不可变的.
10.怎样防止指针的越界使用问题?
答案:必须让指针指向一个有效的内存地址,
1 防止数组越界
2 防止向一块内存中拷贝过多的内容
3 防止使用空指针
4 防止改变const修改的指针
5 防止改变指向静态存储区的内容
6 防止两次释放一个指针
7 防止使用野指针.
11.指针的类型转换?
答案:指针转换通常是指针类型和void * 类型之前进行强制转换,从而与期望或返回void指针的函数进行正确的交接.
12.static有什么用途?(请至少说明两种)
答案:1.限制变量的作用域
2.设置变量的存储域
13.引用与指针有什么区别?
答案: 1) 引用必须被初始化,指针不必。
2) 引用初始化以后不能被改变,指针可以改变所指的对象。
3) 不存在指向空值的引用,但是存在指向空值的指针。
14.描述实时系统的基本特性
答案:在特定时间内完成特定的任务,实时性与可靠性
15.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
答案:全局变量储存在静态数据库,局部变量在堆栈
16.什么是平衡二叉树?
答案:左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1
17.堆栈溢出一般是由什么原因导致的?
答案:没有回收垃圾资源
18.什么函数不能声明为虚函数?
答案:constructor
19. 冒泡排序算法的时间复杂度是什么?
答案:O(n^2)
20. 写出float x 与“零值”比较的if语句。
答案:if(x>0.000001&&x<-0.000001)
21. Internet采用哪种网络协议?该协议的主要层次结构?
答案:tcp/ip 应用层/传输层/网络层/数据链路层/物理层
22. Internet物理地址和IP地址转换采用什么协议?
答案:ARP (Address Resolution Protocol)(地址解析協議)