c++笔试题汇总更新400道.pdf
C+笔试面试1000题1.什 么 是“引用”?申明和使用“引用”要注意哪些问题?答:引用就是某个目标变量的“别名”(a lia s),对应用的操作与对变量直接操作效果完全相同。申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。不能建立数组的引用。2.指针和引用的区别?答:引用是在C+中引入的。它们之间的区别有:(1)非空区别:指针可以为空,而引用不能为空(2)可修改区别:如果指针不是常指针,那么就可以修改指向,而引用不能(3)初始化区别:指针定义时可以不初始化,而引用在定义的时必须初始化3、为什么构造函数不能声明为虚函数?答:因为虚函数采用的是虚调用的方法,虚调用是指允许在只知道部分信息的情况下的工作机制,特别允许我们调用一个只知道接口而不知道其对象的准确类型的函数。但是如果我们要调用构造函数创建对象时,必须要知道对象的准确类型,因此构造函数不能为虚函数。4.char strl=w abc”;char str2=abc;strl=str2 为 FALSE,因为 strl和str2是位于堆栈上的,它们占用不同的内存空间。Const char str3=abc;const char str4=abc;str3=str4为FALSE,同样它们是位于堆栈上的内存空间,是 不 同 的。Const char*str5=abc”,const char*str6=abc;char*str7=abc,char*str8=abc,str5=str6 str7=str8 为 TRUE,因为“abc”是位于文字常量区的,系统会将儿个“abc”进行优化,使它们位于同一块内存区,因此指针的指向也就相同了。5.以下函数能求出数组的长度吗?void fun(char str)int len=sizeof(str)/sizeof(str0);答:不能,数组作为参数传递给函数时,数组名被退化为指针,因此函数中的sizeof(str)实际是在求一个指针的sizeof,答案为4,因此不能计算出数组的长度。6.类的静态成员和非静态成员有何区别?答:类的静态成员每个类只有一个,静态成员为所有类的实例对象共享,静态成员有静态成员变量和静态成员函数,静态成员变量使用前必须初始化,静态成员变量可以被静态成员函数和非静态成员函数访问,而静态成员函数只能访问静态成员变量,因为静态成员函数属于类,其没有this指针。非静态成员每个对象都有一个。7.static的有什么作用(包括在类中)?答:(1)函数体内的静态变量,其值在函数的调用过程中保持不变。跟局部变量的区别。(2)在函数体外定义的静态变量,限制了它的使用范围只在于该子模块,该子模块内的函数都能访问它,但是子模块外不能访问,实际就类似于是一个本地的全局变量。与一般全局变量的区别。(3)类的静态成员函数。本质上来说,static就是声明了对象的生成期,限制了对象的作用域。或(1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只能被分配一次,因此其值在下次函数调用时仍维持上次的值。(2)在模块内的static全局变量可以被模块内的所有函数访问,但不能被模块外其他函数访问。(3)在模块内的static函数只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块。(4)在类中的static成员变量属于整个类所有,对类的所有对象只有一份拷贝。(5)在类中的static成员函数属于整个类所有,这个函数不接受this指针,因而只能访问类的static成员变量。8.写程序,将一个字符串倒序?答:直接在main函数中实现的void main()char*source=hello;char*des;int len=strlen(source);des=(char*)malloc(len+l);申请空间必须是len+1,力 口 1是为了放结束符if(!des)exit(l);char*s=&sourcelen-l;char*d=des;while(len!=0)*d+=*s;*d=0;/必须要coutsourceendl;coutdesendl;9.在 C+程序中调用C 编译后的函数,为什么要加extern C 的声明?答:因为C+支持函数重载,而 C 不支持函数重载。函数被C+编译后在库中的名字与C 语言的不同。假设某个函数的原型为:voidfoo(intx,inty);该函数被C编译器编译后在库中的名字为_f。,而 C+编译器则产生像_foo_int_int之类的名字。C+提供了 C 连接交换指定符号extern C 来解决名字匹配问题。10.C+中哪些函数不能被声明为虚函数?答:普通函数(非成员函数),构造函数,内联成员函数、静态成员函数、友元函数。(1)虚函数用于基类和派生类,普通函数所以不能(2)构造函数不能是因为虚函数采用的是虚调用的方法,允许在只知道部分信息的情况的工作机制,特别允许调用只知道接口而不知道对象的准确类型的方法,但是调用构造函数即使要创建一个对象,那势必要知道对象的准确类型。(3)内联成员函数的实质是在调用的地方直接将代码扩展开(4)继承时,静态成员函数是不能被继承的,它只属于一个类,因为也不存在动态联编等(5)友元函数不是类的成员函数,因此也不能被继承ll.include D include filename.hM 的区别?答:是从标准库路径搜索,是从用户当前工作目录开始,找不到,在到标准库开始12.编写strlen函数,编写strcpy函数答:int Strlen(const char*str)int len=0;assert(str!=NULL);while(*str+!=*0)len+;return len;非空判断是必须进行的操作,可以使用断言的方式assert(str)!=NULL才会继续char*StrCpy(char*strDes,const char*strSrc)assert(strDes!=NULL)&(strSrc!=NULL);char*address=strDes;while(*strDes+=*strSrc+)!=0);return address;首先必须判断两个指针是否为空,由于复制后的指针需要返回,因此需要一个指针来记录地址的初始值,最后将复制的结果返回是为了进行链式操作。13Heap和Stack的 区 别?答:Heap是 堆,Stack是 栈。栈 的 空 间 由 操 作 系 统 自 动 分 配 和 回 收,而 堆 上 的 空 间 由 程 序 员 申 请 和 释放。栈 的 空 间 大 小 较 小,而 堆 的 空 间 较 大。栈 的 地 址 空 间 往 低 地 址 方 向 生 长,而 堆 向高地址 方 向 生 长。栈 的 存 取 效 率 更 高。程 序 在 编 译 期 间 对 变 量 和 函 数 的 内 存 分 配 都 在 栈 上,且 程 序 运 行 过 程 中 对 函 数 调 用 中 参 数 的 内 存 分 配 也 是 在 栈 上。1 4.输 出 的 结 果 是 多 少,并 分 析 过 程?unsigned short A=10;printf(%un,A);char ch=128;printf(a%dn”,ch);答:A=4294967285,首 先 将A转 化 为int类 型,即对应的二进制数值 为:0000000000000000 00000000 00001010,A=11111111 11111111 11111111 11110101,其实这种 情 况 最 高 位 是1,认 为 是 负 数,但 是 在 输 出 中 指 定 以 无 符 号 数 输 出,于 是 结果为4294967285=4294967295(四 字 节 表 示 的 最 大 数)-10.ch=128对 应 的 二 进 制 为:10000000,在 输 出 中 以 整 数 形 式 输 出,由 于最高位是1,于 是 就 是 负 数,10000000是 该 负 数 的 补 码,根 据 求 补 码 的 反 步 骤 计 算,先-1,得到01111111,在 取 反 得10000000=1 2 8,由于本 身 是 负 数,即 为128.15、sizeof和strlen之 间 的 区 别?答:(1)sizeof操 作 符 的 结 果 类 型 是size_t,它 在 头 文 件 中 的typedef为unsigned int类 型,该 类 型 保 证 能 容 纳 实 现 所 建 立 的 最 大 对 象 的 字 节 大 小。(2)sizeof是 运 算 符,strlen是函数(3)sizeof可 以 用 类 型 做 参 数,strlen只 能 用char*做 参 数,且必须是以 0 结尾 的。(4)数 组 做sizeof的 参 数不 退 化,传 递 给strlen就 退 化 为 指 针。(5)大 部 分 编 译 程 序 在 编 译 的 时 候 就 把sizeof计 算 过 了,是 类 型 或 是变量的 长 度。(6)s t r l e n的结果要在运行的时候才能计算出来,用来计算字符串的长度,而不是类型占用内存的大小。(7)s i ze o f后如果是类型必须加括号,如果是变量名可以不加括号。(8)当使用了一个结构类型或变量时,s i ze o f返回实际的大小。(9)数组作为参数传递给函数时传的是指针而不是数组,传递的是数组的首地址。(1 0)计算结构变量的大小就必须讨论数组对齐问题。(1 1)s i ze o f操作符不能用于函数类型,不完全类型或位字段。16.内联函数和宏的差别?答:内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断调用,在编译的时候内联函数可以直接被镶嵌到目标代码中,而宏只是一个简单的替换。内联函数要做参数类型检查,这是与宏相比的优势。I n l i n e是指嵌入代码,就是在调用函数的地方不是跳转,而是把代码直接写到那里去。对于短小的代码来说,i n l i n e可以带来一定效率的提升,而且和C时代的宏函数相比,i n l i n e更安全可靠。可是这是以增加空间消耗为代价的。I n l i n e 一般只适用于:一个函数被不断地重复调用;函数只有简单的儿行,且函数内不能含有f o r w hi l e s w i t c h语句。1 7.请找出下面代码中的所以错误说明:以下代码是把一个字符串倒序,如“a b e d”倒序后变为“d e b a”S in c l u d e “s t r in g,h”m a in()c ha r*s r c=he l l o,w orld;c ha r*d e s t=N U L L;in t l e n=s t r l e n(s r e);d e s t=(c ha r*)m a l l o c(l e n);c ha r*d=d e s t;c ha r*s=s r c l e n ;w hil e(l e n -!=0)d+=s -;p r in t f(/s”,d e s t);r e t u r n 0;)答:方法Lin t m a in ()c ha r*s r e =he l l o,w o r l d”;in t l e n =s t r l e n(s r c);c ha r*d e s t =(c ha r*)m a l l o c (l e n+1);要为 0 分配一个空间c ha r*d =d e s t;c ha r*s =&s r c l e n T;指向最后一个字符w hil e(l e n -!=0 )*d+=*s -;*d =0;尾部要加 0p r in t f(%s n ,d e s t);f r e e(d e s t);使 用完,应当释放空间,以免造成内存汇泄露r e t u r n 0;)18.用两个栈实现一个队列的功能?要求给出算法和思路!设2 个栈为A,B,一开始均为空.入队:将新元素p u s h入栈A;出队:判断栈B 是否为空;如果不为空,则将栈A中所有元素依次p o p 出并p u s h到栈B;(3)将 栈 B 的栈顶元素p o p 出;这样实现的队列入队和出队的平摊复杂度都还是0(1),比上面的几种方法要好1 9 .下面的程序中x 是多少?e n u m s t r in g x l,x 2,x 3=1 0,x 4,x 5,x;x=0 X 8 0 1 0 0 5,0 x 8 0 1 0 f 4;2 0 多态的作用?主要是两个:L 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;2.接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。2 1.N e w d e l e t e 与 m a l l o c f r e e 的联系与区别?都是在堆(he a p)上进行动态的内存操作。用 m a l l o c 函数需要指定内存分配的字节数并且不能初始化对象,n e w 会自动调用对象的构造函数。d e l e t e 会调用对象的d e s t r u c t o r,而 f r e e 不会调用对象的 d e s t r u c t o r.2 2.#d e f in e D O U BL E (x)x+x ,i=5*D 0 U BL E(5);i 是多少?答案:i 为3 0。2 3.局部变量能否和全局变量重名答:能,局部会屏蔽全局。要用全局变量,需要使用:“局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。2、如何引用一个已经定义过的全局变量答:e x t e r n可以用引用头文件的方式,也可以用e x t e r n 关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用e x t e r n 方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错2 4 全局变量可不可以定义在可被多个.C 文件包含的头文件中为什么答:可以,在不同的C 文件中以s t a t i c 形式来声明同名全局变量。可以在不同的C 文件中声明同名的全局变量,前提是其中只能有一个C 文件中对此变量赋初值,此时连接不会出错25.设有以下说明和定义:typedef union long i;int k5;char c;DATE;struct data int cat;DATE cow;double dog;)too;DATE max;则语句 printf(H%d,sizeof(struct date)+sizeof(max);的执行结果是:52答:DATE是一个union,变量公用空间.里面最大的变量类型是int5,占用20个字节.所以它的大小是20 data是一个struct,每个变量分开占用空间.依次为int4+DATE20+doubles=32.所 以 结 果 是 20+32=5 2.当然在 某 些 1 6 位编辑器下,in i可 能 是 2 字节,那么结果是 int2+DATE 10+double8=226.unsigned short hash(unsigned short key)return(key)%256 请问 hash(16),hash(256)的值分别是:A.1.16;B.8.32;C.4.16;D.1.3227请问下面程序有什么错误?int a602501000,i,j,k;for(k=0;k=1000;k+)for(j=0;j250;j+)for(i=0;i60;i+)ajk=O;把循环语句内外换一下28下面程序的打印结果是什么?请分析#define Max_CB 500void LmiQueryCSmd(Struct MSgCB*pmsg)unsigned char ucCmdNum;for(ucCmdNum=0;ucCmdNum=-EPSINON)&(x =或“二”此类形式如下是错误的写法,不得分。if(x=0.0)if(x!=0.0)请写出char*p与“零值”比较的if语句。(3 分)标 准 答 案:if(p=NULL)if(p!=NULL)如下写法均属不良风格,不得分。if(p=0)if(p!=0)if(p)if(!)30编写类String的构造函数、析构函数和赋值函数已知类Siring的原型为:class String public:String(const char*str=NULL);/普通构造函数String(const String&other);/拷贝构造函数 String(void);析构函数String&operate=(const String&other);/赋值函数private:char*m_data;用 于 保 存 字 符 串);请编写String的上述4 个函数。标准答案:、String:-String(void)3 分 delete m_data;由于m_data是内部数据类型,也可以写成delete m_data;)/String 的普通构造函数 String:String(const char*str)6 分 if(str=NULL)m_data=new charl;/若能加NULL判断则更好*m_data=0,;else(int length=strlen(str);String:-String(void)3 分 delete m_data;由于m_data是内部数据类型,也可以写成delete m_data;)“String的普通构造函数String:String(const char*str)6 分 if(str=NULL)m_data=new charl;若能力I NULL判断则更好*m_data=0,;else(int length=strlen(str);strcpy(m_data,other.m_data);赋值函数String&String:operate=(const String&other)13 分(1)检查自赋值 4 分 if(this=&other)return*this;文章来源草根IT释放原有的内存资源 3 分delete m_data;/(3)分配新的内存资源,并复制内容3 分int length=strlen(other.m_data);m_data=new charlength+l;/若 能 力 口 NULL 判断贝U 更好strcpy(m_data,other.m_data)/(4)返回本对象的引用 3 分return*this;31引用”与指针的区别是什么?指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。此外,就是上面提到的对函数传ref和 pointer的区别32结构与联合有和区别?1.结构和联合都是由多个不同的数据类型成员组成,但在任何同一时刻,联合中只存放了一个被选中的成员(所有成员共用一块地址空间),而结构的所有成员都存在(不同成员的存放地址不同)。2.对于联合的不同成员赋值,将会对其它成员重写,原来成员的值就不存在了,而对于结构的不同成员赋值是互不影响的33.下面 关 于“联合”的题目的输出?a)#i nclude union int i;char x2;a;void main()a.xfO=10;a.xl=1;printf(%dH,a.i);答案:266(低位低地址,高位高地址,内存占用情况是OxOlOA)b)main()union /*定义一个联合*/inti;struct /*在联合中定义一个结构*/char first;char second;half;number;number.i=0 x4241;/*联合成员赋值*/prinlf(c%cn,number.half.first,mumber.half.second);number.half.first=a,;/*联合中结构成员赋值*/number.half.second=,b,;getch();答案:AB(0 x41 对应,A,是低位;0 x42 对应B,是 高 位)6261(number.i 和 number.half共用一块地址空间)34关联、聚 合(Aggregation)以及组合(Composition)的区别?涉及到UML中的一些概念:关联是表示两个类的一般性联系,比 如“学生”和“老师”就是一种关联关系;聚合表示has-a的关系,是一种相对松散的关系,聚合类不需要对被聚合类负责,如下图所示,用空的菱形表示聚合关系:从实现的角度讲,聚合可以表示为:class A.class B A*a;.而组合表示contains-a的关系,关联性强于聚合:组合类与被组合类有相同的生命周期,组合类要对被组合类负责,采用实心的菱形表示组合关系:实现的形式是:class A.class B A a;.35面向对象的三个基本特征,并简单叙述之?1.封装:将客观事物抽象成类,每个类对自身的数据和方法实行protection(private,protected,public)2.继承:广义的继承有三种实现形式:实现继承(指使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)。前 两 种(类继承)和后一种(对象组合=接口继承以及纯虚函数)构成了功能复用的两种方式。3.多态:是将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针36.重载(overload)和 重 写(overried,有的书也叫做“覆盖”)的区别?重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。重写:是指子类重新定义复类虚函数的方法。从实现原理上来说:重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function func(p:integer):integer;和 function func(p:string):integer;那么编译器做过修饰后的函数名称可能是这样的:int_func、stjfunc.对于这两个函数的调用,在编译器间就已经确定了,是静态的。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!重写:和多态真正相关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚绑定)37多态的作用是什么?主要是两个:1.隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;2.接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用38若没有定义拷贝构造函数,则编译器自动生成一个缺省的拷贝构造函数,它可能会产生什么问题?浅拷贝问题,主要原因为类中如果有指针成员变量时,当调用拷贝构造函数时只拷贝地址从而使两个对象的指针变量指向了一个地址空间。39简述成员函数、全局函数和友元函数的差别。成员函数只能由该类所实例化的对象来进行调用。静态成员除外全局函数可以在任意位置进行调用。友元函数可以让本类和友元类对象调用。4 0.简述结构化的程序设计、面向对象的程序设计的基本思想。结构化程序设计为从程序代码的开始处按照顺序方式执行至代码的结束位置。是一种顺序的方式,函数与变量没有明显的联系,面向对象主要把处理事情的事物和方法结合为一体成为一个类,一个类具备处理一件事情的数据变量和处理方法,把数据和方法有机的结合为了一体,使每一件事情都具备一定的独立性,形成一个模块。增加了内聚性,降低了耦合性。同时也增加了代码的可读性以及代码的重用性。41结构struct和类class有什么异同?在 c 语言中struct只能对数据进行聚合,而 C+的 class把数据以及对数据的处理方法也同时聚合 为 体,增加了内聚性。止 匕 外 class拥有可再生性和可抽象性,实现的代码的复用。集中体现在派生的功能和多态的功能。同时class也比struct具备更好的封装性,体现在三种访问权限上。在 C+中的struct和 class的结构基本一致,只是struct的默认权限为Public而 class为private042C+是不是类型安全的?答案:不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)。C#是类型安全的。43简述数组与指针的区别?数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。(1)修改内容上的差别char a=hello;a0=X;char*p=w orld;注意p 指向常量字符串p0=X;编译器不能发现该错误,运行时错误(2)用运算符sizeof可以计算出数组的容量(字节数)。sizeof(p),p 为指针得到的是一个指针变量的字节数,而不是p 所指的内存容量。C+/C语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。char a=hello world;char*p=a;cout sizeof(a)endl;/12 字节cout sizeof(p)endl;/4字 节 计算数组和指针的内存容量 void Func(char a100)cout sizeof(a)endl;/4 字节不是 100 字 节)44如何判断一段程序是由C 编译程序还是由C+编译程序编译的?答案:#ifdef_ cplusplus coutc+;#else coutc;#endif45.main主函数执行完毕后,是否可能会再执行一段代码,给出说明?答案:可以,可以用_onexit注册一个函数,它 会 在 main之 后 执 行 intfnl(void),fn2(void),fn3(void),fn4(void);void main(void)String str(zhanglin);_onexit(fnl);_onexit(fn2);_onexit(fn3);_onexit(fn4);printf(This is executed firstAn);int fnl()printf(Hnext.n);return 0;int fn2()printf(executed);return 0;int fn3()printf(is);return 0;int fn4()printf(This*);return 0;4 6文件中有一组整数,要求排序后输出到另一个文件中#i nclude#i nclude using namespace std;void Order(vector&data)/bubble sort int count=data.size()int tag=false 设置是否需要继续冒泡的标志位for(int i=0 i count i+)for(int j=0 j dataj+l)tag=trueint temp=datajdataj=dataj+l datafj+1=temp)if(!tag)break)void main(void)vectordata;ifstream in(c:data.txtn);if(Jin)coutfile error!;exit(l);int temp;while(!in.eof()intemp;data.push_back(temp);in.close。;关闭输入文件流 Order(data);ofstream out(c:result.txt,);if(!out)(cout*file error!;exit(l);)for(i=0 i next=NULL)return head;Node*pl=head;Node*p2=p 1 -next;Node*p3=p2-next;pl-next=NULL;while(p3!=NULL)p2-next=pl;pl=p2;p2=p3p3=p3-next;p2-next=pl;head=p2;return head;(2)已知两个链表headl和 head2各自有序,请把它们合并成一个链表依然有序。(保留所有结点,即便大小相同)Node*Merge(Node*headl,Node*head2)if(head 1 =NULL)return head2;if(head2=NULL)return head 1 ;Node*head=NULL;Node*pl=NULL;Node*p2=NULL;if(headl-data data)head=headl pl=headl-next;p2=head2 elsehead=head2;p2=head2-next;pl=headl;)Node*pcurrent=head;while(pl!=NULL&p2!=NULL)if(pl-data data)pcurrent-next=pl;pcurrent=pl;pl=pl-next;else pcurrent-next=p2;pcurrent=p2;p2=p2-next)if(pl!=NULL)pcurrent-next=pl;if(p2!=NULL)pcurrent-next=p2;return head;(3)已知两个链表headl和 head2各自有序,请把它们合并成一个链表依然有序,这次要求用递归方法进行。(Autodesk)答案:Node*MergeRecursive(Node*headl,Node*head2)if(headl=NULL)return head2;if(head2=NULL)return head 1 ;Node*head=NULL;if(head 1 -data data)head=head 1 ;head-next=MergeRecursive(head 1 -next,head2);else head=head2;head-next=MergeRecursive(head 1 ,head2-next);return head;48写一个函数找出一个整数数组中,第 二 大 的 数(microsoft)答案:const int MINNUMBER=-32767int find_sec_max(int dataf,int count)int maxnumber=data0;int sec_max=MINNUMBER;for(int i=1 i maxnumber)sec_max=maxnumber;maxnumber=data;else if(data sec_max)sec_max=data;return sec_max;49如何判断一个单链表是有环的?(注意不能用标志位,最多只能用两个额外指针)struct node char val;node*next;bool check(const node*head)/return false:无环;true:有环一种O(n)的办法就是(搞两个指针,一个每次递增一步,一个每次递增两步,如果有环的话两者必然重合,反之亦然):bool check(const node*head)if(head=NULL)retum false;node*low=head,*fast=head-next;while(fast!=NULL&fast-next!=NULL)low=low-next;fast=fast-next-next;if(low=fast)return true;return false;50用变量a给出下面的定义a)一个整型数(An integer)b)一个指向整型数的指针(Apointer to an integer)c)一 个 指 向 指 针 的 的 指 针,它 指 向 的 指 针 是 指 向 一 个 整 型 数(A pointer to a pointer to an integer)d)一个有 10 个整型数的数组(An array of 10 integers)e)一个 有 10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers)f)一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数a)int a;/An integerb)int*a;A pointer to an integerc)int*a;A pointer to a pointer to an integer d)int a10;/An array of 10 integerse)int*a10;/An array of 10 pointers to integersf)int(*a)10;/A pointer to an array of 10 integersg)int(*a)(int);/A pointer to a function a that takes an integer argument and returns an integerh)int(*a10)(int);51关键字const是什么含意?我只要一听到被面试者说:“const意味着常数”,我就知道我正在和一个业余者打交道。下面的声明都是什么意思?const int a;int const a;int*const a;int const*a const;前两个的作用是一样,a 是一个常整型数。第三个意味着a 是个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a 是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a 是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。52关键字volatile有什么含意并给出三个不同的例子。一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下 面 是 volatile变量的几个例子:1).并行设备 的 硬 件 寄 存 器(如:状 态 寄 存 器)2).一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)3).多线程应用中被几个任务共享的变量(回答下面问题)1).一个参数既可以是const还可以是volatile吗?解释为什么。2).一个指针可以是volatile吗?解释为什么。3).下面的函数有什么错误:int square(volatile int*ptr)return*ptr*ptr;下面是答案:1).是的。-个例子是只读的状态寄存器。它 是 volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。2).是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buiTer的指针时。3).这段代码的有个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*pt