面试题整理

试卷二

1.填空选择题

1.请写出 char *p 与“零值”比较的 if 语句         if (NULL == p)                  

 

2、写出打印结果___255___

 #include<stdio.h>
 #include<string.h>
 int main()
 {
    char a[1000];
    int i;
    for(i=0;i<1000;i++)
    {
      a[i]=-1-i;  
    }
    

printf("%d",strlen(a));
    return 0;
}

 

3、分析输出结果_________8 8_____________

int arr[] = {6,7,8,9,10};
int *ptr = arr;
*(ptr++)+=123;
printf(“ %d %d ”, *ptr, *(++ptr));

 

f(657, 789)_______723_________

int f(int x, int y)

{

return (x&y)+((x^y)>>1)

}

5、Linux文件权限一共10位长度,分成四段,第三段表示的内容是____c_________

A、文件类型

 

B、文件所有者的权限

 

C、文件所有者所在组的权限

 

D、其他用户的权限

 

二.简答题

1.用变量a给出下面的定义
1) int a;      a 是一个整型变量          

2) int *a;     a是一个整型指针变量        

3)int**a;      a 是一个指针变量,该指针指向一个整形指针的地址
4) int a[10];  a是一个有10个元素的整型数组
5) int *a[10]; a是一个有10个元素的整型数组,该数组中的元素是整型指针
6) int (*a)[10];      a是一个指针变量,该指针指向一个有10个元素的整型数组
7) int (*a)(int);     a是一个函数指针变量,该函数的参数是整型,返回值为整型
8)int (*a[10])(int);  a是一个有10个元素的整型数组
,该数组中的元素是指针,该指针指向一个函数,该函数的参数为整型,返回值为整型

 

2、关键字const的作用是什么?

1.想要阻止一个变量被改变,可以使用const关键字,通常需要对它进行初始化,因为之后再也没有机会对它进行修改。

2.对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const

3.在一个函数声明中,const可以修饰形参,表明是一个输入参数,在函数内部不能改变其值;

 

3、内存的分配方式的分配方式有几种?

1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

3)从堆上分配,亦称动态内存分配。动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,频繁地分配和释放不同大小的堆空间将会产生堆内碎块。

 

4、进程和线程的区别

1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

2) 线程的划分尺度小于进程,使得多线程程序的并发性高。

3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

 

 

 

 

 

 

 

进程间通信方式有哪些?各自有哪些优缺点?

# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

# 有名管道 (named pipe)  有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

# 信号量( semophore )  信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

# 消息队列( message queue )  消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

# 信号 ( sinal )  信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

# 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。

# 套接字( socket )  套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信

 

三.程序题

1.C语言库函数里是否有将字符串转化为数字的函数,若有则用自己的方式实现它。

 

 

Int myatoi(char *p)

{

Int flag = 0;

Int ret = 0;

If(*p == ‘-’)

{

    Flag = -1;

}

If(*p == ‘+’)

{

    Flag = 1;

}

If(*p == ‘+’ || *p == ‘-’)

{

    P++;

}

While(*p != NULL)

{

    Ret = ret* 10 + *p- ‘0’;

    P++;

}

Return flag*ret;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.编写一个程序,实现输出链表中倒数第K个结点

 

   Void  print_k(Link * head, int k)

   {

       int num  = 0;

       int i;

       Link * p = head->next;

       while(NULL != p)

       {

           num++;

           p = p->next;

       }

P = head;

       for(i = 0;i < num - k+1; i++)

       {

           p = p->next;

       }

       

       printf(“%d : %c”,k, p->data);

       

       

   }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值