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