设为首页 加入收藏

TOP

程序员面试必备文档(一)
2014-11-24 01:04:19 来源: 作者: 【 】 浏览:29
Tags:程序员 面试 必备 文档

1.线程与进程的区别


进程,本身不能执行,它只是一个资源的集合体,拥有地址空间,模块,内存,…
线程是真正的执行单元,一个进程如果没有线程,那么就没有存在的意义,因为不可能执行。
2.堆与栈的区别
:全局区(static),文字常量区,栈区(stack),堆区(heap).


该节点的空间分配给程序.


3.进程间的通信方式有哪些
# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
# 有名管道(named pipe) :也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
# 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
# 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
# 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
# 套接字( socket ):套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
4.sizeof与strlen的区别
① sizeof是运算符,计算数据所占的内存空间;strlen()是一个函数,计算字符数组的字符数;
② sizeof可以用类型作参数;strlen()只能用char*作参数,必须是以’/0’结束
③ 数组做sizeof的参数不退化,传递给strlen就退化为指针了;
④ sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小
5.OSI结构模型与TCP/IP结构模型分别为什么


TCP/IP四层参考模型网络接口层-网间层-传输层-应用层
TCP/IP其中有三层对应于ISO参考模型中的相应层。ICP/IP协议族并不包含物理层和数据链路层,因此它不能独立完成整个计算机网络系统的功能.
6.static的作用
①在函数体,个被声明为静态的变量在函数调用的过程中维持其值不变;
②在模块内(函数体外),一个被声明为静态的变量可以被模块内的所有函数访问,但不能被模块外的其他函数访问。它是一个本地的全局变量;
③在模块内,被声明为静态的函数只能被这一模块内的其他函数调用,既函数被限制在声明他的模块范围内。
7.指针和引用的区别
① 引用必须被初始化,指针不必;
② 引用初始化后不能改变,指针可以改变所指的对象;
③ 不存在指向空值的引用,但是存在指向空值的指针。
8.二叉树的遍历
typedef struct node{
  datatype data;
  struct node *lchild,*rchild;
 }bintnode;//定义二叉链表结点结构
createbintree(bintree *t)
 {//输入二叉树的先序遍历序列,创建二叉链表
  char ch;
  if ((ch=getchar())==’ ‘)//如果读入空格字符,创建空树
     *t=null;
  else{
     *t=(bintnode*)malloc(sizeof(bintnode));//申请根结点*t空间
     (*t)->data=ch;//将结点数据ch放入根结点的数据域
     createbintree(&(*t)->lchild);//建左子树
     createbintree(&(*t)->rchild);//建右子树
    }//end of if
 }//end of creatbintree
inorder(bintree t)
 {//对二叉树进行中序遍历
  if (t){
       inorder(t->lchild);
       printf(“%c”,t->data);
       inorder(t->rchild);
     }//end of if
 }//end of inorder
9.哈希冲突(散列表)
哈希冲突函数hv(i),用于在元素i发生哈希冲突时,将其映射至另一个内存位置。由于新产生的映射仍有可能发生冲突(即非同义词冲突),所以哈希冲突函数通常有多个。哈希冲突即关键字不同的元素被映射到了同一个内存位置,包括由同义词冲突和非同义词冲突。


10.虚函数与纯虚函数区别
1类里声明虚函数的作用是为了能让这个函数在它的子类里面被覆盖,这样编译器就可以使用后期绑定来达到多态。纯虚函数接口,是个函数的声明而已,它要留到子类里面去实现。
②虚函数在子类里面也可以不重载,但是纯虚函数必须在子类里面去实现。通常,很多函数加上virtual修辞,虽然牺牲掉一些性能,但是增加了面向对象的多态性,可以阻止父类里面的这个函数在子类里被修改实现;
③虚函数的类继承了接口,同时也继承了父类的实现。纯虚函数关注的是接口的统一性,实现由子类完成;④带纯虚函数的类叫做虚基类。这种基类不能直接声称对象,只能被继承,并重写其虚函数后才能使用,这样的类也叫抽象类。
11.malloc和free,new与delete的使用
delete会调用对象的析构函数,new调用构造函数。malloc与free是C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制 权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
12,表达式后缀
二叉树的后序遍历序列.不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行不再考虑运算符的优先规则,如:2 1+3 *,即(2+1)* 3
建立一个栈S 从左到右读后缀表达式,读到数字就将它转换为数值压入栈S中,读到运算符则从栈中依次弹出两个数分别到Y和X,然后以“X 运算符 Y”的形式计算机出结果,再压加栈S中 如果后缀表达式未读完,就重复上面过程,最后输出栈顶的数值则为结束.
13.A.插入排序(直接插入排序,希尔排序)
直接插入排序: 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
希尔排序: 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插入排序

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇事务是什么? 下一篇八迪科技面试题

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: