海豚浏览器实习生面试记录

都是一些经典的问题~一定要掌握好。

1.深度遍历二叉树的递归算法

先序:根左右

void PreOrder(BTNode *b)
{
    if(b != NULL)
    {
    printf("%c", b->data);
    PreOrder(b->lchild);
    PreOrder(b->rchild);
    }
}

(中序后序都可以写出来,这么简单都忘了。。。)

2.指针数组

数组元素全为指针的数组称为指针数组。一个一维指针数组的定义:int *ptr_array[10]

数组指针是指向数组首元素的地址的指针,其本质为指针

指针数组是数组元素为指针的数组,其本质为数组。

数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。

指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。指针远比数组灵活,但也更危险。

不能对数组名进行直接复制与比较。应该用标准库函数strcpy进行复制。

比较b和a的内容是否相同,不能用if(b==a) 来判断,应该用标准库函数strcmp进行比较。

这是因为sizeof(p)得到的是一个指针变量的字节数,相当于sizeof(char*),而不是p所指的内存容量。C++/C语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。

char *p = "abcdefghijklmnopqrstuvwxyz";
    int length = 0;
    cout<<p;
    cout<<sizeof(p)<<endl;;   //sizeof(p) 始终是4
    for(int i = 0; p[i] != '\0'; i++)//应该这样计算字符串的长度
    {
    length ++;
    }
    cout<<length<<endl;
    cin.get();

3.操作系统进程的状态

(1)运行:当一个进程在处理机上运行时,则称该进程处于运行状态。处于此状态的进程的数目小于等于处理器的数目,对于单处理机系统,处于运行状态的进程只有一个。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。

(2)就绪:当一个进程获得了除处理机以外的一切所需资源,一旦得到处理机即可运行,则称此进程处于就绪状态。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。

(3)阻塞:也称为等待或睡眠状态,一个进程正在等待某一事件发生(例如请求I/O而等待I/O完成等)而暂时停止运行,这时即使把处理机分配给进程也无法运行,故称该进程处于阻塞状态。

进程状态的转换

(1) 就绪→执行

处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成执行状态。

 (2) 执行→就绪

处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完而不得不让出处理机,于是进程从执行状态转变成就绪状态。

 (3) 执行→阻塞

正在执行的进程因等待某种事件发生而无法继续执行时,便从执行状态变成阻塞状态。

 (4) 阻塞→就绪

处于阻塞状态的进程,若其等待的事件已经发生,于是进程由阻塞状态转变为就绪状态。

1:就绪->执行, 当前运行进程阻塞,调度程序选一个优先权最高的进程占有处理机;

2:执行->就绪, 当前运行进程时间片用完;

3:执行->阻塞,当前运行进程等待键盘输入,进入了睡眠状态。

4:阻塞->就绪,I/O操作完成,被中断处理程序唤醒。

  1. 用c语言实现简单的混合四则运算

堆栈,入栈出栈出栈入栈……

  1.   linux进程树概念
    
  2.   grep -1 ![!#]  去掉注释后显示其他的,apache配置文件中