《华为C笔试题》word版.doc
1.static有什么用途?(请至少说明两种) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用2.引用与指针有什么区别? 1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 3) 不存在指向空值的引用,但是存在指向空值的指针。3.描述实时系统的基本特性 在特定时间内完成特定的任务,实时性与可靠性。4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 全局变量储存在静态数据库,局部变量在堆栈。5.什么是平衡二叉树? 左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1。6.堆栈溢出一般是由什么原因导致的? 没有回收垃圾资源。7.什么函数不能声明为虚函数? constructor函数不能声明为虚函数。8.冒泡排序算法的时间复杂度是什么? 时间复杂度是O(n2)。9.写出float x 与“零值”比较的if语句。 if(x>0.000001&&x<-0.000001)10.Internet采用哪种网络协议?该协议的主要层次结构? Tcp/Ip协议 主要层次结构为: 应用层/传输层/网络层/数据链路层/物理层。11.Internet物理地址和IP地址转换采用什么协议? ARP (Address Resolution Protocol)(地址解析協議)12.IP地址的编码分为哪俩部分? IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。13.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。 循环链表,用取余操作做14.不能做switch()的参数类型是: switch的参数不能为实型。1. 以下三条输出语句分别输出什么?C易char str1 = "abc"char str2 = "abc"const char str3 = "abc" const char str4 = "abc" const char* str5 = "abc"const char* str6 = "abc"cout << boolalpha << ( str1=str2 ) << endl; / 输出什么?cout << boolalpha << ( str3=str4 ) << endl; / 输出什么?cout << boolalpha << ( str5=str6 ) << endl; / 输出什么?2. 非C+内建型别 A 和 B,在哪几种情况下B能隐式转化为A?C+中等答:a. class B : public A / B公有继承自A,可以是间接继承的b. class B operator A( ); / B实现了隐式转化为A的转化c. class A A( const B& ); / A实现了non-explicit的参数为B(可以有其他带默认值的参数)构造函数d. A& operator= ( const A& ); / 赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个3. 以下代码中的两个sizeof用法有问题吗?C易void UpperCase( char str ) / 将 str 中的小写字母转换成大写字母 for( size_t i=0; i<sizeof(str)/sizeof(str0); +I ) if( 'a'<=stri && stri<='z' ) stri -= ('a'-'A' );char str = "aBcDe"cout << "str字符长度为: " << sizeof(str)/sizeof(str0) << endl;UpperCase( str );cout << str << endl;4. 以下代码有什么问题?C难void char2Hex( char c ) / 将字符以16进制表示 char ch = c/0x10 + '0' if( ch > '9' ) ch += ('A'-'9'-1); char cl = c%0x10 + '0' if( cl > '9' ) cl += ('A'-'9'-1); cout << ch << cl << ' 'char str = "I love 中国"for( size_t i=0; i<strlen(str); +I ) char2Hex( stri );cout << endl;5. 以下代码有什么问题?C+易struct Test Test( int ) Test() void fun() ;void main( void ) Test a(1); a.fun(); Test b(); b.fun();6. 以下代码有什么问题?C+易cout << (true?1:"1") << endl;7. 以下代码能够编译通过吗,为什么?C+易unsigned int const size1 = 2;char str1 size1 ;unsigned int temp = 0;cin >> temp;unsigned int const size2 = temp;char str2 size2 ;8. 以下代码中的输出语句输出0吗,为什么?C+易struct CLS int m_i; CLS( int I ) : m_i(i) CLS() CLS(0); ;CLS obj;cout << obj.m_i << endl;9. C+中的空类,默认产生哪些类成员函数?C+易答:class Emptypublic: Empty(); / 缺省构造函数 Empty( const Empty& ); / 拷贝构造函数 Empty(); / 析构函数 Empty& operator=( const Empty& ); / 赋值运算符 Empty* operator&(); / 取址运算符 const Empty* operator&() const; / 取址运算符 const;10. 以下两条输出语句分别输出什么?C+难float a = 1.0f;cout << (int)a << endl;cout << (int&)a << endl;cout << boolalpha << ( (int)a = (int&)a ) << endl; / 输出什么?Float b = 0.0f;cout << (int)b << endl;cout << (int&)b << endl;cout << boolalpha << ( (int)b = (int&)b ) << endl; / 输出什么?11. 以下反向遍历array数组的方法有什么错误?STL易vector array;array.push_back( 1 );array.push_back( 2 );array.push_back( 3 );for( vector:size_type i=array.size()-1; i>=0; -I ) / 反向遍历array数组 cout << arrayi << endl;12. 以下代码有什么问题?STL易typedef vector IntArray;IntArray array;array.push_back( 1 );array.push_back( 2 );array.push_back( 2 );array.push_back( 3 );/ 删除array数组中所有的2for( IntArray:iterator itor=array.begin(); itor!=array.end(); +itor ) if( 2 = *itor ) array.erase( itor );13. 写一个函数,完成内存之间的拷贝。考虑问题是否全面答:void* mymemcpy( void *dest, const void *src, size_t count ) char* pdest = static_cast<char*>( dest ); const char* psrc = static_cast<const char*>( src ); if( pdest>psrc && pdest<psrc+cout ) 能考虑到这种情况就行了 for( size_t i=count-1; i!=-1; -I ) pdesti = psrci; else for( size_t i=0; i<count; +I ) pdesti = psrci; return dest;int main( void ) char str = "0123456789" mymemcpy( str+1, str+0, 9 ); cout << str << endl; system( "Pause" ); return 0;本试题仅用于考查C+/C程序员的基本编程技能。内容限于C+/C常用语法,不涉及数据结构、算法以及深奥的语法。考试成绩能反映出考生的编程质量以及对C+/C的理解程度,但不能反映考生的智力和软件开发能力。笔试时间90分钟。请考生认真答题,切勿轻视。一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。(10分)提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例如 int 变量 n 与“零值”比较的 if 语句为:if ( n = 0 )if ( n != 0 )以此类推。请写出 BOOL flag 与“零值”比较的 if 语句:请写出 float x 与“零值”比较的 if 语句:请写出 char *p 与“零值”比较的 if 语句:二、以下为Windows NT下的32位C+程序,请计算sizeof的值(10分)char str = “Hello” ;char *p = str ;int n = 10;请计算sizeof (str ) = sizeof ( p ) = sizeof ( n ) =void Func ( char str100)请计算sizeof( str ) = void *p = malloc( 100 );请计算sizeof ( p ) =三、简答题(25分)1、头文件中的 ifndef/define/endif 干什么用?2、#include 和 #include “filename.h” 有什么区别?3、const 有什么用途?(请至少说明两种)4、在C+ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?5、请简述以下两个for循环的优缺点/ 第一个for (i=0; i+;)if (condition)DoSomething();elseDoOtherthing();/ 第二个if (condition)for (i=0; i+;)DoSomething();elsefor (i=0; i+;)DoOtherthing();优点:缺点:优点:缺点:四、有关内存的思考题(20分)void GetMemory(char *p)p = (char *)malloc(100);void Test(void) char *str = NULL;GetMemory(str); strcpy(str, "hello world");printf(str);请问运行Test函数会有什么样的结果?答:char *GetMemory(void) char p = "hello world"return p;void Test(void)char *str = NULL;str = GetMemory(); printf(str);请问运行Test函数会有什么样的结果?答:Void GetMemory2(char *p, int num)*p = (char *)malloc(num);void Test(void)char *str = NULL;GetMemory(&str, 100);strcpy(str, "hello"); printf(str); 请问运行Test函数会有什么样的结果?答:void Test(void)char *str = (char *) malloc(100);strcpy(str, “hello”);free(str); if(str != NULL)strcpy(str, “world”); printf(str);请问运行Test函数会有什么样的结果?答:五、编写strcpy函数(10分)已知strcpy函数的原型是char *strcpy(char *strDest, const char *strSrc);其中strDest是目的字符串,strSrc是源字符串。(1)不调用C+/C的字符串库函数,请编写函数 strcpy(2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?六、编写类String的构造函数、析构函数和赋值函数(25分)已知类String的原型为:class Stringpublic:String(const char *str = NULL); / 普通构造函数String(const String &other); / 拷贝构造函数 String(void); / 析构函数String & operate =(const String &other); / 赋值函数private:char *m_data; / 用于保存字符串;请编写String的上述4个函数。附录C :C+/C试题的答案与评分标准一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。(10分)请写出 BOOL flag 与“零值”比较的 if 语句。(3分)标准答案:if ( flag )if ( !flag )如下写法均属不良风格,不得分。If (flag = TRUE) if (flag = 1 ) if (flag = FALSE) if (flag = 0) 请写出 float x 与“零值”比较的 if 语句。(4分)标准答案示例:const float EPSINON = 0.00001;if (x >= - EPSINON) && (x <= EPSINON)不可将浮点变量用“=”或“!=”与数字比较,应该设法转化成“>=”或“<=”此类形式。如下是错误的写法,不得分。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 (!) 二、以下为Windows NT下的32位C+程序,请计算sizeof的值(10分)char str = “Hello” ;char *p = str ;int n = 10;请计算sizeof (str ) = 6 (2分) sizeof ( p ) = 4 (2分)sizeof ( n ) = 4 (2分)void Func ( char str100)请计算sizeof( str ) = 4 (2分)void *p = malloc( 100 );请计算sizeof ( p ) = 4 (2分)三、简答题(25分)1、头文件中的 ifndef/define/endif 干什么用?(5分)答:防止该头文件被重复引用。2、#include 和 #include “filename.h” 有什么区别?(5分)华为的CC+面试题Q1:请你分别划划OSI的七层网络结构图,和TCP/IP的五层结构图? : Q2:请你详细的解释一下IP协议的定义,在哪个层上面,主要有什么作用? : TCP与UDP呢? : 总得来说前面两道题目还是比较简单的! : Q3:请问交换机和路由器分别的实现原理是什么?分别在哪个层次上面实 : 现的? : Q4:请问C+的类和C里面的struct有什么区别? : Q5:请讲一讲析构函数和虚函数的用法和作用? : Q6:全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器 : 是怎么知道的? : Q7:一些寄存器的题目,我忘记了具体实什么题目,主要好像是寻址和内 : 存管理等一些知识,不记得了。 : Q8:8086是多少尉的系统?在数据总线上是怎么实现的?还有一些硬件方 : 面的知识我既不清楚了。 : 一般建议参加华为的研发面试的同学先要准备一下相关的知识,软件的主要 : 是看看C和数据结构方面的,硬件模电,数电和微机原理 两道c面试题 1、一个学生的信息是:姓名,学号,性别,年龄等信息,用一个链表,把这些学生信息连在一起, 给出一个age, 在些链表中删除学生年龄等于age的学生信息。 程序代码I nclude "stdio.h"I nclude "conio.h"struct stu char name20; char sex; int no; int age; struct stu * next;*linklist;struct stu *creatlist(int n) int I; /h为头结点,p为前一结点,s为当前结点 struct stu *h,*p,*s; h = (struct stu *)malloc(sizeof(struct stu); h->next = NULL; p=h; for(i=0;i<n;i+) s = (struct stu *)malloc(sizeof(struct stu); p->next = s; printf("Please input the information of the student: name sex no age n"); scanf("%s %c %d %d",s->name,&s->sex,&s->no,&s->age); s->next = NULL; p = s; printf("Create successful!"); return(h);void deletelist(struct stu *s,int a)struct stu *p;while(s->age!=a) p = s; s = s->next;if(s=NULL) printf("The record is not exist.");else p->next = s->next; printf("Delete successful!");void display(struct stu *s)s = s->next; while(s!=NULL) printf("%s %c %d %dn",s->name,s->sex,s->no,s->age); s = s->next; int main() struct stu *s;int n,age;printf("Please input the length of seqlist:n");scanf("%d",&n); s = creatlist(n); display(s);printf("Please input the age:n");scanf("%d",&age);deletelist(s,age);display(s); return 0;2、实现一个函数,把一个字符串中的字符从小写转为大写。 程序代码I nclude "stdio.h"I nclude "conio.h"void uppers(char *s,char *us) for(;*s!='0's+,us+) if(*s>='a'&&*s<='z') *us = *s-32; else *us = *s; *us = '0'int main() char *s,*us; char ss20; printf("Please input a string:n"); scanf("%s",ss); s = ss; uppers(s,us); printf("The result is:n%sn",us); getch();1进程和线程的差别。2.测试方法 3Heap与stack的差别。4Windows下的内存是如何管理的?5介绍.Net和.Net的安全性。6客户端如何访问.Net组件实现Web Service?7C/C+编译器中虚表是如何完成的?8谈谈COM的线程模型。然后讨论进程内/外组件的差别。9谈谈IA32下的分页机制10给两个变量,如何找出一个带环单链表中是什么地方出现环的?11在IA32中一共有多少种办法从用户态跳到内核态?12如果只想让程序有一个实例运行,不能运行两个。像winamp一样,只能开一个窗口,怎样实现?13如何截取键盘的响应,让所有的a变成b?14Apartment在COM中有什么用?为什么要引入?15存储过程是什么?有什么用?有什么优点?16Template有什么特点?什么时候用?17谈谈Windows DNA结构的特点和优点。18.网络编程中设计并发服务器,使用多进程与多线程 ,请问有什么区别?