华为面试题总结.docx

上传人:b****5 文档编号:6792600 上传时间:2023-01-10 格式:DOCX 页数:22 大小:26.46KB
下载 相关 举报
华为面试题总结.docx_第1页
第1页 / 共22页
华为面试题总结.docx_第2页
第2页 / 共22页
华为面试题总结.docx_第3页
第3页 / 共22页
华为面试题总结.docx_第4页
第4页 / 共22页
华为面试题总结.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

华为面试题总结.docx

《华为面试题总结.docx》由会员分享,可在线阅读,更多相关《华为面试题总结.docx(22页珍藏版)》请在冰豆网上搜索。

华为面试题总结.docx

华为面试题总结

华为面试常用考题汇总

一、const用法

const是一个C语言的关键字,它限定一个变量不允许被改变。

范例:

intconstnValue;//nValue是const

  charconst*pContent;//*pContent是const,pContent可变

 (char*)constpContent;//pContent是const,*pContent可变

 char*constpContent;//pContent是const,*pContent可变 

 charconst*constpContent;//pContent和*pContent都是const

二、sizeof用法

sizeof是C语言的一种单目操作符,它并不是函数。

sizeof操作符以字节形式给出了其操作数的存储大小。

操作数可以是一个表达式或括在括号内的类型名。

操作数的存储大小由操作数的类型决定。

1、用于数据类型 

  sizeof使用形式:

sizeof(type)数据类型必须用括号括住。

如sizeof(int)。

 

2、用于变量 

  sizeof使用形式:

sizeof(var_name)或sizeof var_name

 

3、sizeof的结果

3.1、int、unsigned int 、short int、unsigned short、long int、unsignedlong、float,double、long double类型的sizeof分别为2、2、2、2、4、4、4、8、10。

3.2、当操作数是指针时,sizeof的值为4

3.3、当操作数具有数组类型时,其结果是数组的总字节数。

3.4、联合类型操作数的sizeof是其最大字节成员的字节数。

3.5、结构类型操作数的sizeof是这种类型对象的总字节数,包括任何垫补在内。

4、sizeof和强制字节对齐程序范例

#incldue

#include

usingnamespacestd;

struct

{

shorta1;

shorta2;

shorta3;

}A;

struct

{

longa1;

shorta2;

}B;

intmain()

{

char*ss1="0123456789";

charss2[]="0123456789";

charss3[100]="0123456789";

intss4[100];

charq1[]="abc";

charq2[]="a\n";

char*q3="a\n";

char*str1=(char*)malloc(100);

void*str2=(void*)malloc(100);

cout<

cout<

cout<

cout<

cout<

cout<

cout<

cout<

cout<

cout<

cout<

return0;

}

结果:

4,11,100,400,4,3,4,6,8,4,4

三、static用法

1、修饰变量,static变量无论是定义在函数内或外,该变量都位于数据段中;定义于函数体外的static变量的访问域仅仅是它所在文件中定义的函数,其它文件无法通过extern对其申明后访问。

2、修饰函数,static函数只能在声明它的文件当中可见,不能被其它文件使用。

3、类中变量使用static修饰表示变量时类变量,类中函数用static修饰表示函数只能访问类中的static变量,不接受this指针,称为类函数。

四、namespace用法

namespace是为了防止名字污染在标准C++中引入的。

它可以将其中定义的名字隐藏起来,不同的名字空间中可以有相同的名字而互不干扰,使用时用域操作符(:

:

)来引用。

namespace名字

{

定义的数据;

定义的函数;

}

程序范例:

#include

usingnamespacestd;

namespacea

{

intsakura;

}

namespaceb

{

intsakura;

}

namespace

{

intsakura;//相当于静态的全局变量,即作用域为该文件

}

intmain()

{

b:

:

sakura=1;

a:

:

sakura=2;

sakura=3;//调用没有命名的名称空间相当于静态的全局变量

cout<

:

sakura<

cout<

:

sakura<

cout<

return0;

}

五、传递内存错误范例

#include

voidGetMemory(char*p,intnum)

{

p=(char*)malloc(sizeof(char)*num);

}

intmain()

{

char*str=NULL;

GetMemory(str,100);

strcpy(str,"hello");

return0;

}

解析:

本例GetMemory中为p开辟了新的内存,但是没有返回,str还是NULL,执行strcpy()函数时将出错,并且为P开辟的内容没有释放将造成内存泄露。

六、C++基本容器比较

1、vector:

向量容器,使用线性存储结构,可以像数组一样随机(下标)访问元素,还可以在尾部插入元素(用push_back()函数)。

特点:

访问元素速度快,但插入、删除操作速度慢;

2、list:

双向链表容器,数据元素是通过链表指针串连成逻辑意义上的线性表,但在物理内存中数据可以是不连续的。

特点:

对链表的任一位置的元素进行插入、删除和查找操作都是极快速的,但由于通过指针串连而成(这里的指针也占用了内存空间),不能通过下标访问元素,因此list容器访问元素的速度比vector慢;

3、deque:

双端队列容器,跟vector一样和采用线性表存储结构,但与vector唯一不同的是,deque采用分块的线性存储结构来存储数据,每块的大小一般为512字节,称为一个deque块,所有的deque块使用一个Map块进行管理,每个Map数据项记录各个deque块的首地址。

特点:

可以在deque块的头部和尾部插入和删除元素而不需移动其他元素,所以插入和删除操作速度比vector快。

一般来说,当考虑到容器元素的内存分配策略和操作的性能时,deque相对于vector更有优势。

总结:

一般来说,当访问元素次数比较多时,用vector比较好;当插入、删除、查找元素的次数比较多时,用list比较好;当访问线性表的头部和尾部、插入、删除次数较多时,用deque比较好;

七、指针和引用区别

1、非空区别。

可以有空指针,没有指向空值的应用。

2、可修该区别。

指针与引用的一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。

但是引用则总是指向在初始化是被指定的对象,以后不能改变,但是指定的对象其内容可以改变。

3、应用区别。

存在不指向任何对象的可能,在不同的时刻指向不同的对象时使用指针。

总是指向一个对象并且一旦指向一个对象后就不会改变指向的情况下应该使用应用。

八、函数重载

定义:

所谓函数重载是指同一个函数名可以对应着多个函数的实现。

函数重载类型包括:

1、参数类型不同的函数重载。

如:

add(5,10)和add(5.0,10.0)

2、参数个不同的函数重载。

如:

add(inta,intb,intc)和add(inta,intb)

九、进程和线程

1.定义:

进程:

是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.

线程:

是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

2、线程和进程的关系是:

线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。

线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。

3、linux下创建进程和线程:

创建进程调用函数pid_tfork();创建线程调用函数pthread_create()。

4、进程间通信:

最常见的进程间通信包括:

信号,信号量,消息队列,共享内存。

十、模板

定义:

模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现了真正的代码可重用性。

模版分类:

1.函数模版

2.另外一个是类模版。

函数模板的一般形式如下:

Template返回类型函数名(形参表)

{//函数定义体}

说明:

template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,如果类型形参多余一个,每个形参前都要加class<类型形参表>可以包含基本数据类型可以包含类类型.

程序范例:

#include

usingstd:

:

cout;

usingstd:

:

endl;

//声明一个函数模版,用来比较输入的两个相同数据类型的参数的大小,class也可以被typename代替,//T可以被任何字母或者数字代替。

template

Tmin(Tx,Ty)

{return(x

x:

y;}

voidmain()

{

intn1=2,n2=10;

doubled1=1.5,d2=5.6;

cout<<"较小整数:

"<

cout<<"较小实数:

"<

system("PAUSE");

}

程序分析:

main()函数中定义了两个整型变量n1,n2两个双精度类型变量d1,d2然后调用min(n1,n2);即实例化函数模板Tmin(Tx,Ty)其中T为int型,求出n1,n2中的最小值.同理调用min(d1,d2)时,求出d1,d2中的最小值.

类模板的一般形式如下:

Templateclass类名{

//类定义......

};

说明:

其中,template是声明各模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个。

程序范例:

//ClassTemplate.h

#ifndefClassTemplate_HH

#defineClassTemplate_HH

template

classmyClass{

private:

T1I;

T2J;

public:

myClass(T1a,T2b);//Constructor

voidshow();

};

//这是构造函数

//注意这些格式

template

myClass:

:

myClass(T1a,T2b):

I(a),J(b){}

//这是voidshow();

template

voidmyClass:

:

show()

{

cout<<"I="<

}

#endif

//Test.cpp

#include

#include"ClassTemplate.h"

usingstd:

:

cout;

usingstd:

:

endl;

voidmain()

{

myClassclass1(3,5);

class1.show();

myClassclass2(3,'a');

class2.show();

myClassclass3(2.9,10);

class3.show();

system("PAUSE");

}

十一、tcp/ip协议基本知识

1、名词解释

IP:

网间协议(InternetProtocol)负责主机间数据的路由和网络上数据的存储。

同时为ICMP,TCP,UDP提供分组发送服务。

用户进程通常不需要涉及这一层。

  ARP:

地址解析协议(AddressResolutionProtocol)此协议将网络地址映射到硬件地址。

  RARP:

反向地址解析协议(ReverseAddressResolutionProtocol)此协议将硬件地址映射到网络地址

  ICMP:

网间报文控制协议(InternetControlMessageProtocol)此协议处理信关和主机的差错和传送控制。

  TCP:

传送控制协议(TransmissionControlProtocol)这是一种提供给用户进程的可靠的全双工字节流面向连接的协议。

它要为用户进程提供虚电路服务,并为数据可靠传输建立检查。

(注:

大多数网络用户程序使用TCP)

  UDP:

用户数据报协议(UserDatagramProtocol)这是提供给用户进程的无连接协议,用于传送数据而不执行正确性检查。

  FTP:

文件传输协议(FileTransferProtocol)允许用户以文件操作的方式(文件的增、删、改、查、传送等)与另一主机相互通信。

  SMTP:

简单邮件传送协议(SimpleMailTransferProtocol)SMTP协议为系统之间传送电子邮件。

  TELNET:

终端协议(TelnetTerminalProcotol)允许用户以虚终端方式访问远程主机

  HTTP:

超文本传输协议(HypertextTransferProcotol)  

  TFTP:

简单文件传输协议(TrivialFileTransferProtocol)

2、TCP/IP特点

  TCP/IP协议的核心部分是传输层协议(TCP、UDP),网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中实现。

因此用户一般不涉及。

编程时,编程界面有两种形式:

一、是由内核心直接提供的系统调用;二、使用以库函数方式提供的各种函数。

前者为核内实现,后者为核外实现。

用户服务要通过核外的应用程序才能实现,所以要使用套接字(socket)来实现。

2.1、套接字

  套接字是网络的基本构件。

它是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和一个与之相连听进程。

套接字存在通信区域(通信区域又称地址簇)中。

套接字只与同一区域中的套接字交换数据(跨区域时,需要执行某和转换进程才能实现)。

WINDOWS中的套接字只支持一个域——网际域。

套接字具有类型。

  WINDOWSSOCKET1.1版本支持两种套接字:

流套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM)

  2.2、WINDOWSSOCKETS实现

  一个WINDOWSSOCKETS实现是指实现了WINDOWSSOCKETS规范所描述的全部功能的一套软件。

一般通过DLL文件来实现

  2.3、阻塞处理例程

  阻塞处理例程(blockinghook,阻塞钩子)是WINDOWSSOCKETS实现为了支持阻塞套接字函数调用而提供的一种机制。

  2.4、多址广播(multicast,多点传送或组播)

  是一种一对多的传输方式,传输发起者通过一次传输就将信息传送到一组接收者,与单点传送(unicast)和广播(Broadcast)相对应。

3、客户机/服务器模式

  在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Servermodel)。

该模式的建立基于以下两点:

1、非对等作用;2、通信完全是异步的。

客户机/服务器模式在操作过程中采取的是主动请示方式:

首先服务器方要先启动,并根据请示提供相应服务:

(过程如下)

  1、打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。

  2、等待客户请求到达该端口。

  3、接收到重复服务请求,处理该请求并发送应答信号。

  4、返回第二步,等待另一客户请求

  5、关闭服务器。

  客户端:

  1、打开一通信通道,并连接到服务器所在主机的特定端口。

  2、向服务器发送服务请求报文,等待并接收应答;继续提出请求……

  3、请求结束后关闭通信通道并终止。

  基本套接字

  为了更好说明套接字编程原理,给出几个基本的套接字,在以后的篇幅中会给出更详细的使用说明。

  1、创建套接字——socket()

  功能:

使用前创建一个新的套接字

  格式:

SOCKETPASCALFARsocket(intaf,inttype,intprocotol);

  参数:

af:

通信发生的区域

  type:

要建立的套接字类型

  procotol:

使用的特定协议

  2、指定本地地址——bind()

  功能:

将套接字地址与所创建的套接字号联系起来。

  格式:

intPASCALFARbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);

  参数:

s:

是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。

  其它:

没有错误,bind()返回0,否则SOCKET_ERROR

  地址结构说明:

structsockaddr_in

{

shortsin_family;//AF_INET

u_shortsin_port;//16位端口号,网络字节顺序

structin_addrsin_addr;//32位IP地址,网络字节顺序

charsin_zero[8];//保留

}

  3、建立套接字连接——connect()和accept()

  功能:

共同完成连接工作

  格式:

intPASCALFARconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);

  SOCKETPASCALFARaccept(SOCKETs,structsockaddrFAR*name,intFAR*addrlen);

  参数:

同上

  4、监听连接——listen()

  功能:

用于面向连接服务器,表明它愿意接收连接。

  格式:

intPASCALFARlisten(SOCKETs,intbacklog);

  5、数据传输——send()与recv()

  功能:

数据的发送与接收

  格式:

intPASCALFARsend(SOCKETs,constcharFAR*buf,intlen,intflags);

  intPASCALFARrecv(SOCKETs,constcharFAR*buf,intlen,intflags);

  参数:

buf:

指向存有传输数据的缓冲区的指针。

  6、多路复用——select()

  功能:

用来检测一个或多个套接字状态。

  格式:

intPASCALFARselect(intnfds,fd_setFAR*readfds,fd_setFAR*writefds,

fd_setFAR*exceptfds,conststructtimevalFAR*timeout);

  参数:

readfds:

指向要做读检测的指针

     writefds:

指向要做写检测的指针

    exceptfds:

指向要检测是否出错的指针

     timeout:

最大等待时间

  7、关闭套接字——closesocket()

  功能:

关闭套接字s

  格式:

BOOLPASCALFARclosesocket(SOCKETs);

面向连接的套件字的函数调用过程

服务器方:

1.socket()建立流式套接字,返回套接字号s

2.bind(),套接字与本地地址相连接

3.listen(),通知TCP服务器准备好接收连接

4.accept(),接收连接,等待客户端的连接

5.建立连接,accept()返回,得到新的套接字,如ns

6.recv()/send(),在套接字ns上读写数据,直到完成交换

7.closesocket(),关闭套接字ns

8.closesocket(),关闭最初套接字s,服务结束

客户端:

1.socket()建立流式套接字,返回套接字号s

2.connect(),将套接字s与远地主机连接

3.recv()/send(),在套接字上读写数据,直到完成数据交换

4.closesocket(),关闭套接字s,结束TCP对话

无连接协议的套接字的函数调用过程

服务器方:

1.socket()建立流式套接字,返回套接字号s

2.bind(),套接字与本地地址相连接

3.recv()/send(),在套接字ns上读写数据,直到完成交换

4.closesocket(),关闭最初套接字s,服务结束

客户端:

1.socket()建立流式套接字,返回套接字号s

2.bind(),套接字与本地地址相连接

3.recv()/send(),在套接字上读写数据,直到完成数据交换

4.closesocket(),关闭套接字s

十二、二叉树

1、二叉树:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1