zoukankan      html  css  js  c++  java
  • 常见笔试题

    1.sizeof和strlen的区别

    ①sizeof是算符,在编译期间计算;strlen是函数,在运行期间计算。

    ②strlen只能用char*做参数,且必须是以’‘结尾的,计算结果不包括’‘。

    ③数组作为strlen的参数时,退化为指针;数组作为sizeof的参数时不退化。

    ④sizeof计算对象在内存中所占字节,strlen计算字符长度。

    如:int a[10] = {0};  sizeof(a)结果为40

    2.TCP/IP建立、关闭连接的过程

    TCP/IP通过三次握手建立一个连接

    第一次握手:客户端发生SYN包(syn=j)到服务器,并进入SYN_SEND状态,等待服务确认。

    第二次握手:服务器收到SYN包,对客户的SYN进行确认(SYN=j+1),同时自己也发送一个ACK包(ack=k)。服务器进入SYN_RECV状态。

    第三次握手:客户端收到服务器的SYN包和ACK包,对ACK进行确认,向服务器发送确认包ACK(ack=k+1)。客户端和服务器进入ESTABLISHED状态,完成三次握手,客户端和服务器开始传送数据。

    TCP/IP通过四次挥手关闭一个连接:

    1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。

    2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。

    3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。

    4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。

    3.模板类的作用

    ①创建动态变化大小的数据结构。

    ②类型无关,高复用性;平台无关,高移植性。

    4.C++中4种类型转换方式

    static_cast:编译器隐式执行任何类型转换都可由static_cast显示完成。执行非多态的转换。

    int i;
    float f = 166.71;
    i = static_cast<int>(f);

    dynamic_cast:用于安全的沿类的继承关系向下进行类型转换。

    classB
    {
    public:
        virtual void foo();
    };// 注意dynamic_cast转换时,基类中必须有虚函数,static_cast无此限制。
    
    class D:public B
    {
    };
    
    voidfunc(B* pb)
    {
        D* pd1=static_cast<D*>(pb);
        D* pd2=dynamic_cast<D*>(pb);
    }

    reinterpret_cast:转换指针为其他类型指针。慎用

    const_cast:操纵传递对象的const属性。

    ①常量指针被转化成非常量的指针,并且仍然指向原来的对象;
    ②常量引用被转换成非常量的引用,并且仍然指向原来的对象;
    const B b1;
    B *b2 = const_cast<B*>(&b1);
    B &b3 = const_cast<B&>(b1);
    
    b2->m_iNum = 200;    //fine
    b3.m_iNum = 300;      //fine

    5.进程和线程的区别?

    进程创建时自动创建一个线程。线程是进程内的一个执行单元,运行在进程内,同一进程产生的线程共享同一内存空间。

    ①线程开销小,但不利于资源的管理与保护,进程相反。

    ②每个进程都有自己的地址空间,一个进程中所有线程共享地址空间。

    ③线程通信快,切换快,资源利用率较好。

    线程使用公共变量或内存要通过同步机制。

    线程是指进程内的一个执行单元,也是进程内的可调度实体.
    与进程的区别:
    (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
    (2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
    (3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
    (4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。 

    6.进程进入等待状态的方式

    ①CPU被调度给更高优先级线程

    ②等待资源。

    ③CPU时间片到了。

    7.TCP和UDP的区别?

    TCP传输控制协议,提供面向连接,可靠的字节流服务,客户端和服务器交换数据前必须建立连接。

    TCP提供超时重发、丢弃重复数据等功能。

    UDP用户数据协议,面向数据报的运输层协议,只负责把数据报发送出去,不保证它们能达到目的地。

    UDP不用建立连接,无超时重发等机制,所以速度很快。

    8.OSI七层协议及各层作用?

    物理层:透明传输比特流。

    数据链路层:传输有地址的帧及错误检测。ARP等

    网络层:为数据包选择路由。      IP、ICMP、IGMP等

    传输层:提供端对端接口。       TCP、UDP等

    会话层:建立或关闭连接。

    表示层:数据格式化、加密等。

    应用层:文件传输、电子邮件等。    HTTP、FTP、DNS、TELNET等

    9.动态链接库的两种方式。

    第一种,静态链接。_declspec(dllexport)修饰函数。

    第二种,动态链接。def文件中导出函数,LoadLibrary(dllname)和GetProcAccess导入和调用函数。

    10.数组和链表的区别

    数组长度固定,链表动态的进行存储分配。

    数组中的元素在内存中连续存放,删除、插入元素时需要移动其他元素,可以通过下标访问数组中任何数据;

    链表中的元素通过元素中的指针联系在一起,不是连续存放的,访问速度慢,但删除数据快。

    数组从栈中分配内存空间,链表从堆中分配存储空间。

    11.递归和循环

    递归需多次调用函数,对执行效率有影响。

    12.static

    函数体中的static变量作用范围为该函数体。该变量的内存只被分配了一次,下次调用仍维持上次的值。

    模块中的static全局变量可被模块内所有函数访问,但不能被模块外其他函数访问。

    类中static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝。

    类中static成员函数属于整个类所有,这个函数不接收this指针,因而只能访问类的static成员函数。

    13.const

    (1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;
    (2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;
    (3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
    (4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;
    (5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。

    14.引用与指针有什么区别?
    1) 引用必须被初始化,指针不必。
    2) 引用初始化以后不能被改变,指针可以改变所指的对象。
    3) 不存在指向空值的引用,但是存在指向空值的指针。

    15.winsock建立连接的主要实现步骤?
    答:服务器端:socker()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接。
    客户端:socker()建立套接字,连接(connect)服务器,连接上后使用send()和recv(),在套接字上写读数据,直至数据交换完毕,closesocket()关闭套接字。
    服务器端:accept()发现有客户端连接,建立一个新的套接字,自身重新开始等待连接。该新产生的套接字使用send()和recv()写读数据,直至数据交换完毕,closesocket()关闭套接字。

    16.用变量a给出下面的定义

    a) 一个整型数(An integer)
    b)一个指向整型数的指针( A pointer to an integer)
    c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an intege)r
    d)一个有10个整型数的数组( An array of 10 integers)
    e) 一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to integers)
    f) 一个指向有10个整型数数组的指针( A pointer to an array of 10 integers)
    g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)
    h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an integer )

    答案是:
    a) int a; // An integer
    b) int *a; // A pointer to an integer
    c) int **a; // A pointer to a pointer to an integer
    d) int a[10]; // An array of 10 integers
    e) int *a[10]; // An array of 10 pointers to integers
    f) int (*a)[10]; // A pointer to an array of 10 integers
    g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
    h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

  • 相关阅读:
    Archlinux 下系统如何设置让 Wine 调用 ibus输入法
    ArchLinux下Ecplise软件报错
    ArchLinux下shadow服务报错
    【转载】maven入门1
    oracle_sql语句的大全
    pl/sql快速输入select等语句
    [转载]彻底卸载oracleXE数据库服务器
    [转载]struts1小项目
    [工作]双核系统struts-config.xml
    java request获取各种数据
  • 原文地址:https://www.cnblogs.com/SnailProgramer/p/4496632.html
Copyright © 2011-2022 走看看