笔试训练3

一、静态链表是数组,动态链表是指针;静态链表中指针表示的是数组下标

二、进程:一个程序运行时向系统申请分配的资源;线程:一个进程包含多个线程

线程是进程的一部分,使用线程有利于提高程序的执行效率,线程切换开销比进程切换开销低,同一个进程中的线程可以共享全局变量

三、TCP协议特点:可靠性、面向连接、可控制;TCP协议可以将原主机的字节无差错的传送到目的主机

TCP/IP协议(从下往上):网络接口层、网络层、传输层、应用层

OSI参考模型:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层
TCP/IP的三次握手:

第一次握手:建立连接时,客户端发送syn包(syn = j)到服务器,并进入SYN_SEND模式,等待服务器确认;

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

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack = k+1),此时发送完毕,客户端和服务器进入EATABLISHED状态,完成三次握手。

TCP/IP的四次挥手:

某个应用进程首先调用close,我们称该端执行主动关闭。该端的TCP是发送一个FIN分节,表示数据发送完毕。

接收到这个FIN的对端执行被动关闭。这个FIN由TCP确认,他的接受也作为一个文件结束符EOF传递给接收端应用进程(放在已排队等候该应用进程接收的任何其他数据之后),因为FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。

一段时间后,接收到这个文件结束符的应用进程将调用close关闭他的套接字,这导致他的TCP也发送一个FIN。

接收这个最终FIN的原发送端TCP,即执行主动关闭的那一端确认这个FIN。

TCP/IP协议包含了哪些协议?

应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。 
传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。
互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。
网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。
四、数组和指针的区别:

(1)指针是动态分配空间,通过malloc在堆上分配所需要的空间,分配的空间不一定连续,在使用完之后需要调用free()来释放分配空间。而数组是静态分配空间,在全局变量区或者栈上分配空间,分配的空间是连续的,局部变量在生命周期结束后自动释放,全局变量在程序结束完自动释放。
(2)访问效率:指针是通过地址间接访问,而数组是直接访问数值。因此指针的访问效率低,数组的访问效率高。
(3)安全性:指针使用不当会造成内存泄漏,数组使用不当会造成数组越界。
(4)函数参数:数组要用相应的指针当形参,而指针要用指针的指针来当形参。
(5)字节大小:指针的字节大小是固定的,由操作系统决定。数组的字节大小由数组大小和数组指向的类型共同来决定。
(6)标识符:指针名是变量,数组名是指针常量。所以指针p可以进行p++,而数组名不可以用于a++。
(7)对应的内存空间:指针保存的是地址,数组保存的是数值。

五、关键字const是什么含义?有什么作用?

const是将一个变量或常量添加到符号表里,编译程序时,略过编译这个变量,提升了效率。

指针可以修改const变量

六、const和#define相比有何优点?

首先阐述两者区别
就起作用的阶段而言: #define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用。
就起作用的方式而言: #define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。 
就存储方式而言:#define只是进行展开,有多少地方使用,就替换多少次,它定义的宏常量在内存中有若干个备份;const定义的只读变量在程序运行过程中只有一份备份。
从代码调试的方便程度而言: const常量可以进行调试的,define是不能进行调试的,因为在预编译阶段就已经替换掉了。
综上所述const有以下几个优点
(1)const常量有数据类型,编译器可对其类型进行安全检查
(2)const常量可进行调试
(3)const可节省空间,避免不必要的内存分配,提高效率

七、什么是预编译,何时需要预编译?

预编译又称为预处理 , 是做些代码文本的替换工作。
处理以# 开头的指令 , 比如拷贝 #include 包含的文件代码,#define 宏定义的替换 , 条件编译等,就是为编译做的预备工作的阶段。
主要处理#开始的预编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。
C 编译系统在对程序进行通常的编译之前,首先进行预处理。
 c 提供的预处理功能主要有以下三种:
 1 )宏定义 
 2 )文件包含 
 3 )条件编译
何时需要预编译:
总是使用不经常改动的大型代码体。
程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个“预编译头”



你可能感兴趣的:(笔试训练3)