您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 面试题(包括c、c%2B%2B、数据库、算法、嵌入式等)
王为顺第1页2020-5-16C/C++模块1、为什么C语言中,一个结构体变量占内存的字节数有时候不等于各成员变量占字节数之和?若有如下定义:structdata{inti;charch;doublef;}b;则结构变量b占用内存的字节数是多少?16个2、关键字static的作用是什么?在C语言中,关键字static有三个明显的作用:•在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。•在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。•在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。3、关键字const有什么含意?constinta;//a是一个常整型数intconsta;//a是一个常整型数constint*a;//a是一个指向常整型数的指针(也就是整型数是不可修改的,但指针可以)int*consta;//a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)intconst*aconst;//a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。顺带提一句,也许你可能会问,即使不用关键字const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?我也如下的几下理由:•关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为王为顺第2页2020-5-16常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)•通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。•合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。4、overload和override的区别重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。5、改错题voidtest2(){charstring[10],str1[10];inti;for(i=0;i10;i++){str1='a';}strcpy(string,str1);}试题3:voidtest3(char*str1){charstring[10];if(strlen(str1)=10){strcpy(string,str1);}}对试题2,如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string,str1)调用使得从str1[url=]内存[/url]起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10分;对试题3,if(strlen(str1)=10)应改为if(strlen(str1)10),因为strlen的结果未统计’\0’所占用的1个字节。试题4:voidGetMemory(char*p){p=(char*)malloc(100);}voidTest(void){char*str=NULL;GetMemory(str);strcpy(str,helloworld);printf(str);}试题5:char*GetMemory(void){charp[]=helloworld;returnp;}王为顺第3页2020-5-16voidTest(void){char*str=NULL;str=GetMemory();printf(str);}试题6:voidGetMemory(char**p,intnum){*p=(char*)malloc(num);}voidTest(void){char*str=NULL;GetMemory(&str,100);strcpy(str,hello);printf(str);}试题7:voidTest(void){char*str=(char*)malloc(100);strcpy(str,hello);free(str);...//省略的其它语句}解答:试题4传入中GetMemory(char*p)函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完char*str=NULL;GetMemory(str);后的str仍然为NULL;试题5中charp[]=helloworld;returnp;的p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。这是许多程序员常犯的错误,其根源在于不理解变量的生存期。试题6的GetMemory避免了试题4的问题,传入GetMemory的参数为字符串指针的指针,但是在GetMemory中执行申请内存及赋值语句*p=(char*)malloc(num);后未判断内存是否申请成功,应加上:if(*p==NULL){...//进行申请内存失败处理}试题7存在与试题6同样的问题,在执行char*str=(char*)malloc(100);后未进行内存是否申请成功的判断;另外,在free(str)后未置str为空,导致可能变成一个“野”指针,应加上:str=NULL;试题6的Test函数中也未对malloc的内存进行释放。//为了实现链式操作,将目的地址返回,加3分!王为顺第4页2020-5-16char*strcpy(char*strDest,constchar*strSrc){assert((strDest!=NULL)&&(strSrc!=NULL));char*address=strDest;while((*strDest++=*strSrc++)!=‘\0’);returnaddress;}6、为什么标准头文件都有类似以下的结构?#ifndef__INCvxWorksh#define__INCvxWorksh#ifdef__cplusplusexternC{#endif/*...*/#ifdef__cplusplus}#endif#endif/*__INCvxWorksh*/解答:头文件中的编译宏#ifndef__INCvxWorksh#define__INCvxWorksh#endif的作用是防止被重复引用。作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在symbol库中的名字与C语言的不同。例如,假设某个函数的原型为:voidfoo(intx,inty);该函数被C编译器编译后在symbol库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。_foo_int_int这样的名字包含了函数名和函数参数数量及类型信息,C++就是考这种机制来实现函数重载的。为了实现C和C++的混合编程,C++提供了C连接交换指定符号externC来解决名字匹配问题,函数声明前加上externC后,则编译器就会按照C语言的方式将该函数编译为_foo,这样C语言中就可以调用C++的函数了。试题5:编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefgh”,函数头是这样的://pStr是指向以'\0'结尾的字符串的指针//steps是要求移动的nvoidLoopMove(char*pStr,intsteps){王为顺第5页2020-5-16//请填充...}正确解答1:voidLoopMove(char*pStr,intsteps){intn=strlen(pStr)-steps;chartmp[MAX_LEN];strcpy(tmp,pStr+n);strcpy(tmp+steps,pStr);*(tmp+strlen(pStr))='\0';strcpy(pStr,tmp);}正确解答2:voidLoopMove(char*pStr,intsteps){intn=strlen(pStr)-steps;chartmp[MAX_LEN];memcpy(tmp,pStr+n,steps);memcpy(pStr+steps,pStr,n);memcpy(pStr,tmp,steps);}剖析:这个试题主要考查面试者对标准库函数的熟练程度,在需要的时候引用库函数可以很大程度上简化程序编写的工作量。7、编写类String的构造函数、析构函数和赋值函数,已知类String的原型为:classString{public:String(constchar*str=NULL);//普通构造函数String(constString&other);//拷贝构造函数~String(void);//析构函数String&operate=(constString&other);//赋值函数private:char*m_data;//用于保存字符串};解答://普通构造函数String::String(constchar*str){if(str==NULL){m_data=newchar[1];//得分点:对空字符串自动申请存放结束标志'\0'的空//加分点:对m_data加NULL判断*m_data='\0';}else{intlength=strlen(str);m_data=newchar[length+1];//若能加NULL判断则更好strcpy(m_data,str);}王为顺第6页2020-5-16}//String的析构函数String::~String(void){delete[]m_data;//或deletem_data;}//拷贝构造函数String::String(constString&other)//得分点:输入参数为const型{intlength=strlen(other.m_data);m_data=newchar[length+1];//加分点:对m_data加NULL判断strcpy(m_data,other.m_data);}//赋值函数String&String::operate=(constString&other)//得分点:输入参数为const型{if(this==&other)//得分点:检查自赋值return*this;delete[]m_data;//得分点:释放原有的内存资源intlength=strlen(other.m_data);m_data=newchar[length+1];//加分点:对m_data加NULL判断strcpy(m_data,other.m_data);return*this;//得分点:返回本对象的引用}剖析:能够准确无误地编写出String类的构造函数、拷贝构造函数、赋值函数和析构函数的面试者至少已经具备了C++基本功的60%以上!在这个类中包括了指针类成员变量m_data,当类中包括指针类成员变量时,一定要重载其拷贝构造函数、赋值函数和析
本文标题:面试题(包括c、c%2B%2B、数据库、算法、嵌入式等)
链接地址:https://www.777doc.com/doc-5398026 .html