C++面试题经典问题.doc

上传人:飞****2 文档编号:63856022 上传时间:2022-11-27 格式:DOC 页数:15 大小:77KB
返回 下载 相关 举报
C++面试题经典问题.doc_第1页
第1页 / 共15页
C++面试题经典问题.doc_第2页
第2页 / 共15页
点击查看更多>>
资源描述

《C++面试题经典问题.doc》由会员分享,可在线阅读,更多相关《C++面试题经典问题.doc(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、C,C+经典问题,及面试笔试题1 编程基础1.1 基本概念1.1.1 指针的理解:const char*, char const*, char*const的区别问题几乎是C+面试中每次都会有的题目。 事实上这个概念谁都有只是三种声明方式非常相似很容易记混。 Bjarne在他的The C+ Programming Language里面给出过一个助记的方法: 把一个声明从右向左读。 char *const cp; ( * 读成 pointer to ) cp is a const pointer to char /int* const指向常量的指针const char * p; p is a po

2、inter to const char; /const int*常指针char const * p; 同上因为C+里面没有const*的运算符,所以const只能属于前面的类型。2. 指针cint *pn;-指针数组,每个元素均为指向整型数据的指针。int (*)pn;-p为指向一维数组的指针,这个一维数组有n个整型数据。int *p();-函数返回指针,指针指向返回的值。int (*)p();-p为指向函数的指针。3. 数组越界问题下面这个程序执行后会有什么错误或者效果: #define MAX 255int main() unsigned char AMAX,i; for (i=0;i=M

3、AX;i+) Ai=i;解答:MAX=255,数组A的下标范围为:0.MAX-1,这是其一,其二 当i循环到255时,循环内执行: A255=255;这句本身没有问题,但是返回for (i=0;i=MAX;i+)语句时,由于unsigned char的取值范围在(0.255),i+以后i又为0了.无限循环下去.注:char类型为一个字节,取值范围是-128,127,unsigned char 0 ,2554. C+:memset ,memcpy 和strcpy 的根本区别? #include memory.hmemset用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为或

4、0;例:char a100;memset(a, 0, sizeof(a); memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:char a100,b50; memcpy(b, a, sizeof(b);注意如用sizeof(a),会造成b的内存地址溢出。 strcpy就只能拷贝字符串了,它遇到0就结束拷贝;例:char a100,b50;strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个0之前)是否超过50位,如超过,则会造成b的内存地址溢出。strcpy 原型:extern char *strcpy(char *dest

5、,char *src); 用法:#include 功能:把src所指由NULL结束的字符串复制到dest所指的数组中。说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。memcpy 原型:extern void *memcpy(void *dest, void *src, unsigned int count);用法:#include 功能:由src所指内存区域复制count个字节到dest所指内存区域。说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。Memset原型:extern void *memse

6、t(void *buffer, char c, int count);用法:#include 功能:把buffer所指内存区域的前count个字节设置成字符c。说明:返回指向buffer的指针。5. ASSERT()是干什么用的ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。例如,变量n在程序中不应该为0,如果为0可能导致错误,你可以这样写程序: . ASS

7、ERT( n != 0); k = 10/ n; . ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略。 assert()的功能类似,它是ANSI C标准中规定的函数,它与ASSERT的一个重要区别是可以用在Release版本中。 6. (pause);系统的暂停程序,按任意键继续,屏幕会打印,按任意键继续。 省去了使用getchar();system7. 请问C+的类和C里面的struct有什么区别?c+中的类具有成员保护功能,并且具有继承,多态这类oo特点,而c里的struct没有 8. 请讲一讲析构函数和虚函数的用法和作用?析构函数也是特殊的类成员函数,它没

8、有返回类型,没有参数,不能随意调用,也没有重载。只是在类对象生命期结束的时候,由系统自动调用释放在构造函数中分配的资源。这种在运行时,能依据其类型确认调用那个函数的能力称为多态性,或称迟后联编。另:析构函数一般在对象撤消前做收尾工作,比如回收内存等工作,虚函数的功能是使子类可以用同名的函数对父类函数进行重载,并且在调用时自动调用子类重载函数,如果是纯虚函数,则纯粹是为了在子类重载时有个统一的命名而已。9. 全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的?全局变量的生命周期是整个程序运行的时间,而局部变量的生命周期则是局部函数或过程调用的时间段。其实现是由编译器在编译时

9、采用不同内存分配方法。全局变量在main函数调用后,就开始分配,如果是静态变量则是在main函数前就已经初始化了。而局部变量则是在用户栈中动态分配的(还是建议看编译原理中的活动记录这一块)10. 8086是多少位的系统?在数据总线上是怎么实现的?8086系统是16位系统,其数据总线是20位。1.2 程序设计1. 编写用C语言实现的求n阶阶乘问题的递归算法:long int fact(int n) int x; long int y; if(nhigh) return -1; mid=(low+high)/2; if(x=amid) return mid; if(xamid) return(BS

10、earch(a,x,low,mid-1); else return(BSearch(a,x,mid+1,high);2) 非递归方法实现:int BSearch(elemtype a,keytype key,int n) int low,high,mid; low=0;high=n-1; while(low=high) mid=(low+high)/2; if(amid.key=key) return mid; else if(amid.key2解:int f(int n) int i,s,s1,s2; s1=1;/*s1用于保存f(n-1)的值*/ s2=1;/*s2用于保存f(n-2)的值

11、*/ s=1; for(i=3;i=n;i+) s=s1+s2; s2=s1; s1=s; return(s);4. 交换两个数,不用第三块儿内存:int a = ;int b = ;a = a + b;b = a - b;a = a - b;或者:a = a b;b = a b;a = a b;5. 冒泡排序:void BubbleSort(elemtype x,int n) int i,j; elemtype temp; for(i=1;in;i+) for(j=0;jxj+1.key) temp=xj; xj=xj+1; xj+1=temp; 6. C语言文件读写#include std

12、io.hmain() FILE *fp; char ch,filename10; scanf(%s,filename); if(fp=fopen(filename,w)=NULL) printf(cannt open filen); exit(0); ch=getchar(); while(ch!=#) fputc(ch,fp); putchar(ch); ch=getchar(); fclose(fp);7. 编程winsocket#include #include void main() WORD wVersionRequested; WSADATA wsaData; int err; w

13、VersionRequested = MAKEWORD(1,1); err = WSAStartup(wVersionRequested,&wsaData); if( err != 0) return; if(LOBYTE( wsaData.wVersion ) != 1|HIBYTE( wsaData.wVersion) != 1) WSACleanup(); return; SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_

14、ANY); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR); listen(sockSrv,5); SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); while(1) SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); char sendBuf100; sprint(sendBuf,Welcome %s to

15、http:/www.sunxin.org, inet_ntoa(addrClient.sin_addr); send(sockConn,sendBuf,strlen(sendBuf)+1,0); char recvBuf100; recv(sockConn,recvBuf); printf(%sn,recvBuf); closesocket(sockConn); WSACleanup(); 注:这是Server端;File-New-Win32 Console Application,工程名:TcpSrv;然后,File-New-C+ Source File,文件名:TcpSrv;在该工程的Se

16、tting的Link的Object/library modules项要加入ws2_32.lib#include #include void main() WORDwVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(1,1); err = WSAStartup(wVersionRequested,&wsaData); if( err != 0) return; if(LOBYTE( wsaData.wVersion ) != 1|HIBYTE( wsaData.wVersion) != 1) WSAC

17、leanup(); return; SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=inet_addr(127.0.0.1); addrSrv.sin_family=AF_INET; addrSrv.sin_porthtons(6000); connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR); char recvBuf100; recv(sockClient,recvBuf,100,0)

18、; printf(%sn,recvBuf); send(sockClient,This is zhangsan,strlen(This is zhangsan)+1,0); closesocket(sockClient); WSACleanup();注:这是Client端;File-New-Win32 Console Application,工程名:TcpClient;然后,File-New-C+ Source File,文件名:TcpClient;同理,在该工程的Setting的Link的Object/library modules项要加入ws2_32.lib8. C类的知识#include

19、 class humanpublic: human() human_num+; static int human_num; human() human_num-; print(); void print() couthuman num is: human_num= - EPSINON) & (x =”或“=”此类形式。如下是错误的写法,不得分。if (x = 0.0)if (x != 0.0)请写出 char *p 与“零值”比较的 if 语句。(3 分)标准答案:if (p = NULL)if (p != NULL) /if( 0 = p ), if( 0 != p )如下写法均属不良风格,

20、不得分。if (p = 0)if (p != 0)if (p)if (!)二、以下为Windows NT 下的32 位C+程序,请计算sizeof 的值(10 分)void Func ( char str100) 请计算 sizeof( str ) = 4 (2 分)char str = “Hello” ;char *p = str ;int n = 10;请计算sizeof (str ) = 6 (2 分)sizeof ( p ) = 4 (2 分)sizeof ( n ) = 4 (2 分)void *p = malloc( 100 );请计算sizeof ( p ) = 4 (2 分)三

21、、简答题(25 分)1、头文件中的 ifndef/define/endif 干什么用?(5 分)答:防止该头文件被重复引用。2、#include 和 #include “filename.h” 有什么区别?(5 分)答:对于#include ,编译器从标准库路径开始搜索 filename.h对于#include “filename.h” ,编译器从用户的工作路径开始搜索 filename.h3、const 有什么用途?(请至少说明两种)(5 分)答:(1)可以定义 const 常量,(2)const 可以修饰函数的参数、返回值,甚至函数的定义体。被const 修饰的东西都受到强制保护,可以预防

22、意外的变动,能提高程序的健壮性。4、在C+ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”? (5 分)答:C+语言支持函数重载,C 语言不支持函数重载。函数被C+编译后在库中的名字与C 语言的不同。假设某个函数的原型为: void foo(int x, int y);该函数被C 编译器编译后在库中的名字为_foo , 而C+编译器则会产生像_foo_int_int 之类的名字。C+提供了C 连接交换指定符号extern“C”来解决名字匹配问题。5、请简述以下两个for 循环的优缺点(5 分)for (i=0; iN; i+) if (condition) DoSome

23、thing(); else DoOtherthing();优点:程序简洁缺点:多执行了N-1 次逻辑判断,并且打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。if (condition) for (i=0; iN; i+) DoSomething();else for (i=0; iN; i+) DoOtherthing();优点:循环的效率高缺点:程序不简洁四、有关内存的思考题(每小题5 分,共20 分)void GetMemory(char *p) p = (char *)malloc(100);void Test(void) char *str = NULL; G

24、etMemory(str); strcpy(str, hello world); printf(str);请问运行Test 函数会有什么样的结果?答:程序崩溃。因为GetMemory 并不能传递动态内存,Test 函数中的 str 一直都是 NULL。strcpy(str, hello world);将使程序崩溃。char *GetMemory(void) char p = hello world; return p;void Test(void) char *str = NULL; str = GetMemory(); printf(str);请问运行Test 函数会有什么样的结果?答:可能是乱码。因为GetMemory 返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。void GetMemory2(char *p, int num) *p = (char *)malloc(num);void Test(void) char *str = NULL; GetMemory(&str, 100); strcpy(str, hello); printf

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁