C/C++面试/笔试问题个人总结

1.new malloc delete free 之间的关系
C语言中malloc()函数申请空间,free()函数释放空间【固定搭配】

C++中特有new和delete运算符,(都是在堆区申请空间,必须手动释放)
在C++中使用new 和delete可以使用C++的一些新特性(调用构造函数和析构函数)
new可以分配一块空间并指定存放的数据类型,还可以根据给定的参数列表对这段空间进行初始化
申请数组空间时不能对这一段空间进行初始化

2.重写和重载的关系
重写:
在子父类当中,子类的函数和父类的完全一样,子类重写了父类的函数(覆盖),当子类重写了父类的函数之后,使用子类对象调用的就是子类的函数

重载:
在一个类中,有多个重名的函数,但是其参数不一样(参数的个数,参数的类型,参数的顺序),和返回值类型无关。

3.指针和引用的区别
指针:

int a;
int *p = &a;

p是一个指向变量a的指针,是指向关系,p并不是a所代表的内存空间别名,p自己也有一块空间。

引用:

int a = 10;
int &b = a;

变量b是变量a的引用,可以指代同一份数据,可以通过改变引用来修改原始变量中存储的数据

4.链表的逆序

node * reversed(node * head)
{
	node *pf =NULL;
	node *pb =NULL;
	node *tmp =NULL;
	pf = head;
	
	if(head =NULL)
	{
		printf("链表为空!\n");
		return head;
	}
	else if(head->next = NULL)
	{
		printf("只有一个结点!\n");
		return head;
	}
	else
	{
		pb = pf->next;
		head->next =NULL;
		while(pb != NULL)
		{
			tmp = pb;
			pb = pb->next;
			tmp->next = pf;
			pf = tmp;
		}	
		head = pf;
		return head;
	}
}

C语言中static修饰的全局变量和普通全局变量有什么区别?
非静态全局变量的作用域是整个源程序,静态全局变量的作用域局限于一个源文件内
static全局变量只初使化一次,防止在其他文件单元中被引用;
static修饰的局部变量和全局变量有什么区别?
static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别?
static函数作用域仅在本文件,
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
数据交换的代码
异或法

int a,b;

a = a^b;
b = a^b;
a = a^b;

加减法

int a,b;

a = b - a;
b = b - a;
a = a +b;

5.TCP为啥三次握手,四次挥手
建立TCP连接时,需要服务器和客户端总共发送三个包。

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

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

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

在这里插入图片描述
TCP连接删除时,需要发送四个包
第一次挥手:Client ,设置Sequence Number和Acknowledgment Number,向 Server发送一个FIN报文段;此时,Client 进入FIN_WAIT_1状态;这表示 Client 没有数据要发送给 Server了。

第二次挥手:Server 收到了 Client 发送的FIN报文段,向 Client 回一个ACK报文段,Acknowledgment Number 为 Sequence Number 加 1;Client 进入 FIN_WAIT_2 状态;Server 告诉 Client ,我“同意”你的关闭请求;

第三次挥手:Server 向 Client 发送 FIN 报文段,请求关闭连接,同时 Server 进入 CLOSE_WAIT 状态。

第四次挥手:Client 收到 Server 发送的 FIN 报文段,向 Server 发送 ACK 报文段,然后 Client 进入TIME_WAIT 状态;Server 收到 Client 的 ACK 报文段以后,就关闭连接;此时,Client等待2MSL后依然没有收到回复,则证明 Server 端已正常关闭,那好,Client 也可以关闭连接了。

在这里插入图片描述
不稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。
稳定的排序算法:冒泡排序、插入排序、归并排序、基数排序。

冒泡排序算法

void swap(int* x,int* y)   //数据交换
{
	int tmp=*x;   
	*x=*y;   
	*y=tmp;
}

void BubbleSortEx(int array[],int  size)
{
	if(size <= 1)
	{
		return ;
	}
	int i ;
	int k ;
	for(i = 0; i < size; i ++)
	{
		for(k = size - 1; k > i; k --)
		{
			if(array[k]<array[k-1])  //升序排序
			{
				swap(&array[k],&array[k - 1]);
			}
		}	
	}
}

数组和指针的区别

指针数组
动态分配,分配的空间不一定是连续的静态分配,且分配的空间是连续的
可能会造成内存泄漏可能会造成数组越界
指针用指针的指针来接(函数形参)一维数组用元素指针来接(函数形参)
间接访问直接访问
偏向于地址的处理偏向于数据的处理

const和#define的区别

const#define
在 编译、运行的时候起作用编译的预处理阶段起作用
有对应的数据类型,是要进行判断只是简单的字符串替换,没有类型检查
只有一份备份有若干个备份
const常量可以进行调试不能进行调试

什么是预编译,什么时候需要预编译
预编译:代码文本的替换(宏定义、文件包含、条件编译)

何时:
1、总是使用不经常改动的大型代码体。
2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。
C++从源文件到可执行文件经历哪些过程?
1、预处理,产生.ii文件
2、编译,产生汇编文件(.s文件)
3、汇编,产生目标文件(.o或.obj文件)
4、链接,产生可执行文件(.out或.exe文件)

用C++设计一个不能被继承的类
不能被继承,那把构造函数和析构函数设计成私有的

class A
{
private:
	int num;
public:
	static A* getInstance(int n)
	{
		A* pa = new A();
		pa->num = n;
		return pa;
	}
	static void destructInstance(A* pInstance)
	{
		delete pInstance;
		pInstance = NULL;
	}
private:
	A()
	{}
	~A()
	{}	
};

STL有哪些智能指针
std::auto_ptr(已经被C++11弃用)
std::unique_ptr
(独占式的指针,尝试将它复制给其他指针会编译报错,但是可以通过std::move()进行操作,操作之后原先的指针也不能用)
std::shared_ptr(共享式所有权的指针,它允许多个指针指向同一个对象)
std::weak_ptr
为了辅助shared_ptr而存在,在上面shared_ptr 前提条件下,在counter里面加入weak_counter计数器,所以有了两个计数器(shared_counter, weak_counter)

按值传递、按引用传递、按地址传递的区别
值传递:
形参是实参的拷贝(会在栈内存中创建形参并拷贝实参的值),函数执行完毕后会自动清除栈内存。值传递是单向的,形参不能改变实参。当内部函数不需要改变实参则采用值传递。

引用传递:
&表示引用实参,即代表形参是实参的一个别名。在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。被调函数对形参做的任何操作都影响了主调函数中的实参变量。

按地址传递:
本质是值传递,只不过它传递的是一个地址值,函数执行的时候在栈中创建并拷贝实参的地址值。函数可以根据地址,找到地址指向的内存单元。因而可以改变主函数实参指向的变量的值。如果要数据对象是数组,则只能使用指针。
进程间通信的方式?进程、线程和协程的区别?
1.管道(Pipe)、命名管道(FIFO)、消息队列(Message Queue) 、信号量(Semaphore) 、共享内存(Shared Memory)、套接字(Socket)。

协程:只使用一个线程,在一个线程中规定某个代码块执行顺序。协程能保留上一次调用时的状态,不需要像线程一样用回调函数,所以性能上会有提升。 不想线程那样消耗资源。

操作系统中什么是死锁?产生的条件是什么?如何避免?
死锁:同一组进程中,每一个进程都在等待仅由该组进程中的其它进程才能引发的事件

产生条件:(产生死锁四个条件缺一不可)
1、互斥条件:一个资源每次只能被一个进程使用,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
2、请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求时,该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
3、不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放)。
4、循环等待条件: 若干进程间形成首尾相接循环等待资源的关系。

避免:
1、在系统中不允许进程在已获得某种资源的情况下,申请其他资源,即要想出一个办法,阻止进程在持有资源的同时申请其它资源。
2、允许对资源实行抢夺。
3、(破坏循环等待条件对系统所有资源进行线性排序并赋予不同的序号,这样我们便可以规定进程在申请资源时必须按照序号递增的顺序进行资源的申请)
4、利用银行家算法

alpha测试
由一个用户在开发环境下进行的测试,目的是评价软件产品的FLURPS(即功能、局域化、可使用性、可靠性、性能和支持),尤其注重产品的界面和特色。
beta测试
软件的多个用户在一个或多个用户的实际使用环境下进行的测试,有软件的最终用户们在一个或多个客房场所进行,它是一种验收测试。开发者通常不在测试现场,Beta测试不能有程序员或测试员完成。

操作系统的什么是优先级翻转?解决算法有哪些?
定义:低优先级的任务先于高优先级的任务执行了,优先级搞反了。
解决方案:优先级继承、优先级天花板、两者结合

SQL
查询出学院名为“计算机系”的分数最高的前20名学生姓名。
数据库中有学院表和成绩表
学院表T_SCHOOL,结构如下:
学院ID:school_id;
学院名称:school_name;
成绩表T_SCORE,结构如下:
学号:id;
姓名:name;
分数:score;
学院ID:school_id;

select top 20 T_SCORE.name from T_SCORE,T_SCHOOL 
where T_SCORE.school_id = T_SCHOOL.school_id T_SCHOOL.name = "计算机系"
order by T_SCORE.score desc;       //按照分数且为降序

1、处理机主要由处理器、存储器和总线(数据总线、地址总线、控制总线)组成
2、USB3.0的传输速率为500mb/s
3、视频编码中,不能被其他帧参考的是B帧
4、操作系统切换进程的直接原因(运行进程出错终止、运行进程时间片花完、运行进程等待其他事件)
5、TCP/IP四层模型至顶而下分别为(应用层、传输层、网络层、数据传输层)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值