华为面试题及答案

本文解析了华为面试中常见的C/C++编程题目,包括变量作用域、数据类型转换、内存管理等核心概念,提供了详细的答案与代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



华为面试题及答案
  
1、局部变量能否和全局变量重名 
  
    答:能,局部会屏蔽全局。要用全局变量,需要使用"::"
  
    局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。
  
2、如何引用一个已经定义过的全局变量 
  
    答:extern
  
    可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
  
3、全局变量可不可以定义在可被多个.C文件包含的头文件中 为什么 
  
    答:可以,在不同的C文件中以static形式来声明同名全局变量。
  
    可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错
  
4、语句for( ;1 ;)有什么问题 它是什么意思 
  
    答:和while(1)相同。
  
5、do……while和while……do有什么区别 
  
    答:前一个循环一遍再判断,后一个判断以后再循环
  
6、请写出下列代码的输出内容
  
    以下是引用片段:
  
    #include 
  
    main() 
  
    { 
  
    int a,b,c,d; 
  
    a=10; 
  
    b=a++; 
  
    c=++a; 
  
    d=10*a++; 
  
    printf("b,c,d:%d,%d,%d",b,c,d); 
  
    return 0; 
  
    } 
  
    答:10,12,120
  
7、static全局变量与普通的全局变量有什么区别 static局部变量和普通局部变量有什么区别 static函数与普通函数有什么区别
  
    全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能 IT人才网(it.ad0.cn) 使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。
  
    从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
  
    static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件
  
    static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
  
    static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
  
    static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
  
8、程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。
  
9、设有以下说明和定义:
  
    typedef union {long i; int k[5]; char c;} DATE;
  
    struct data { int cat; DATE cow; double dog;} too;
  
    DATE max;
  
    则语句 printf("%d",sizeof(struct date)+sizeof(max));的执行结果是:___52____
  
    答:DATE是一个union, 变量公用空间. 里面最大的变量类型是int[5], 占用20个字节. 所以它的大小是20
  
    data是一个struct, 每个变量分开占用空间. 依次为int4 + DATE20 + double8 = 32.
  
    所以结果是 20 + 32 = 52.
  
    当然...在某些16位编辑器下, int可能是2字节,那么结果是 int2 + DATE10 + double8 = 20
  
10、队列和栈有什么区别 
  
    队列先进先出,栈后进先出
  
11、写出下列代码的输出内容
  
    以下是引用片段:
  
    #include 
  
    int inc(int a) 
  
    { 
  
    return(++a); 
  
    } 
  
    int multi(int*a,int*b,int*c) 
  
    { 
  
    return(*c=*a**b); 
  
    } 
  
    typedef int(FUNC1)(int in); 
  
    typedef int(FUNC2) (int*,int*,int*); 
  
    void show(FUNC2 fun,int arg1, int*arg2) 
  
    { 
  
    INCp=&inc; 
  
    int temp =p(arg1); 
  
    fun(&temp,&arg1, arg2); 
  
    printf("%d\n",*arg2); 
  
    } 
  
    main() 
  
    { 
  
    int a; 
  
    show(multi,10,&a); 
  
    return 0; 
  
    } 
  
    答:110
  
12、请找出下面代码中的所以错误
  
    说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”
  
    以下是引用片段:
  
    1、#include"string.h" 
  
    2、main() 
  
    3、{ 
  
    4、 char*src="hello,world"; 
  
    5、 char* dest=NULL; 
  
    6、 int len=strlen(src); 
  
    7、 dest=(char*)malloc(len); 
  
    8、 char* d=dest; 
  
    9、 char* s=src[len]; 
  
    10、 while(len--!=0) 
  
    11、 d++=s--; 
  
    12、 printf("%s",dest); 
  
    13、 return 0; 
  
    14、} 
  
    答:
  
    方法1:
  
    以下是引用片段:
  
    int main() 
  
    { 
  
    char* src ="hello,world"; 
  
    int len = strlen(src); 
  
    char* dest = (char*)malloc(len+1);//要为\0分配一个空间 
  
    char* d = dest; 
  
    char* s = &src[len-1];//指向最后一个字符 
  
    while( len-- != 0 ) 
  
    *d++=*s--; 
  
    *d = 0;//尾部要加\0 
  
    printf("%s\n",dest); 
  
    free(dest);// 使用完,应当释放空间,以免造成内存汇泄露 
  
    return 0; 
  
    } 
  
    方法2:
  
    以下是引用片段:
  
    #include 
  
    #include 
  
    main() 
  
    { 
  
    char str[]="hello,world"; 
  
    int len=strlen(str); 
  
    char t; 
  
    for(int i=0; i 
  
    { 
  
    t=str; 
  
    str=str[len-i-1]; str[len-i-1]=t; 
  
    } 
  
    printf("%s",str); 
  
    return 0; 
  
    } 
  
    1.-1,2,7,28,,126请问28和126中间那个数是什么 为什么 
  
    第一题的答案应该是4^3-1=63
  
    规律是n^3-1(当n为偶数0,2,4)n^3+1(当n为奇数1,3,5)
  
    答案:63
  
    2.用两个栈实现一个队列的功能 要求给出算法和思路!
  
    设2个栈为A,B, 一开始均为空.
  
    入队:
  
    将新元素push入栈A;
  
    出队:
  
    (1)判断栈B是否为空;
  
    (2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;
  
    (3)将栈B的栈顶元素pop出;
  
    这样实现的队列入队和出队的平摊复杂度都还是O(1), 比上面的几种方法要好。3.在c语言库函数中将一个字符转换成整型的函数是atool()吗,这个函数的原型是什么 
  
    函数名: atol
  
    功 能: 把字符串转换成长整型数
  
    用 法: long atol(const char *nptr);
  
    程序例:
  
    以下是引用片段:
  
    #include 
  
    #include 
  
    int main(void) 
  
    { 
  
    long l; 
  
    char *str ="98765432"; 
  
    l = atol(lstr); 
  
    printf("string = %s integer = %ld\n", str, l); 
  
    return(0); 
  
    } 
  
13.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现 
  
    c用宏定义,c++用inline
  
14.直接链接两个信令点的一组链路称作什么 
  
    PPP点到点连接
  
15.接入网用的是什么接口 
  
16.voip都用了那些协议 
  
17.软件测试都有那些种类 
  
    黑盒:针对系统功能的测试
  
    白合:测试函数功能,各函数接口
  
18.确定模块的功能和模块的接口是在软件设计的那个队段完成的 
  
    概要设计阶段
  
19.
  
    enum string
  
    {x1,x2,x3=10,x4,x5,}x;
  
    问x= 0x801005,0x8010f4 ;
  
20.
  
    unsigned char *p1;
  
    unsigned long *p2;
  
    p1=(unsigned char *)0x801000;
  
    p2=(unsigned long *)0x810000;
  
    请问p1+5= ;
  
    p2+5= ;
  
    选择题:
  
21.Ethternet链接到Internet用到以下那个协议 
  
    A.HDLC;B.ARP;C.UDP;D.TCP;E.ID
  
22.属于网络层协议的是:
  
    A.TCP;B.IP;C.ICMP;D.X.25
  
23.Windows消息调度机制是:
  
    A.指令队列;B.指令堆栈;C.消息队列;D.消息堆栈;
  
24.
  
    unsigned short hash(unsigned short key)
  
    {
  
    return (key>>)%256
  
    }
  
    请问hash(16),hash(256)的值分别是:
  

    A.1.16;B.8.32;C.4.16;D.1.32


25. 类成员函数的重载、覆盖和隐藏区别 
答案: 
成员函数被重载的特征: 
(1)相同的范围(在同一个类中); 
(2)函数名字相同; 
(3)参数不同; 
(4)virtual 关键字可有可无。 
覆盖是指派生类函数覆盖基类函数,特征是: 
(1)不同的范围(分别位于派生类与基类); 
(2)函数名字相同; 
(3)参数相同; 
(4)基类函数必须有virtual 关键字。 
“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下: 
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键
字,基类的函数将被隐藏(注意别与重载混淆)。 
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual
 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆) 

26.There are two int variables: a and b, don’t use “if”, “? :”, “switch”
 
or other judgement statements, find out the biggest one of the two 
numbers. 
答案:( ( a + b ) + abs( a – b ) ) / 2


27. 重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别?


重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

重写:是指子类重新定义复类虚函数的方法。

28. 多态的作用?

主要是两个:1. 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;2. 接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。

29. New delete 与malloc free 的联系与区别?

答案:都是在堆(heap)上进行动态的内存操作。用malloc函数需要指定内存分配的字节数并且不能初始化对象,new 会自动调用对象的构造函数。delete 会调用对象的destructor,而free 不会调用对象的destructor.

30. 有哪几种情况只能用intialization list 而不能用assignment? 

答案:当类中含有const、reference 成员变量;基类的构造函数都需要初始化表。

31. main 函数执行以前,还会执行什么代码?

答案:全局对象的构造函数会在main 函数之前执行。

32. 描述内存分配方式以及它们的区别?

1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。

2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。

3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。 

33.分别写出BOOL,int,float,指针类型的变量



补充://////////////////////////////////////////////  另外一些面试题 ////////////////////////////////

一.  华为的CC++面试题:
  
  Q1:请你分别划划OSI的七层网络结构图,和TCP/IP的五层结构图? 
  : Q2:请你详细的解释一下IP协议的定义,在哪个层上面,主要有什么作用? 
  : TCP与UDP呢? 
  : 总得来说前面两道题目还是比较简单的! 
  : Q3:请问交换机和路由器分别的实现原理是什么?分别在哪个层次上面实 
  : 现的? 
  : Q4:请问C++的类和C里面的struct有什么区别? 
  : Q5:请讲一讲析构函数和虚函数的用法和作用? 
  : Q6:全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器 
  : 是怎么知道的? 
  : Q7:一些寄存器的题目,我忘记了具体实什么题目,主要好像是寻址和内 
  : 存管理等一些知识,不记得了。 
  : Q8:8086是多少尉的系统?在数据总线上是怎么实现的?还有一些硬件方 
  : 面的知识我既不清楚了。 
  
  : 一般建议参加华为的研发面试的同学先要准备一下相关的知识,软件的主要 
  : 是看看C和数据结构方面的,硬件模电,数电和微机原理


部分答案:

Q4:请问C++的类和C里面的struct有什么区别?
结构是一种将数据集合成组的方法,类是一种同时将函数和数据都集合成组的方法。结构和类在表面上的唯一区别是:类中的成员在默认情况下是私有的,而结构中的成员在默认情况下是公用的。   
  class   foo   
  {   
  private:   
        int   data1;   
  public:   
        void   func();   
  };   
  可以写成:   
  class   foo   
  {   
        int   data1;   
  public:   
        void   func();   
  };   
  因为在类中默认的是私有的,所以关键字private就可以不写了。
如果想用结构完成这个类所作的相同的事,就可以免去关键字public,并将公有成员放置在私有成员之前:   
  struct   foo   
  {   
          void   func();   
  private:   
        int   data1;   
  };
Q5:请讲一讲析构函数和虚函数的用法和作用?
在JAVA里没有象C++中的,所谓的析构函数 ,因为当一个对象不在使用的时候,它会自动被垃圾回收器回收,所以也就用不着析构函数了, 那个finalize 也只有在被垃圾回收器回收,才会被执行,而且很多时候,垃圾回收器并不一定执行,所以它不能当做C++中的,所谓的析构函数使用, 虚函数在JAVA里也是没有的,比较象近的应该算是abstract。
Q6:全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?


1)、全局变量的作用用这个程序块,而局部变量作用于当前函数
2)、前者在内存中分配在全局数据区,后者分配在栈区
3)、生命周期不同:全局变量随主程序创建和创建,随主程序销毁而销毁,局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在
4)、使用方式不同:通过声明后全局变量程序的各个部分都可以用到,局部变量只能在局部使用


 
二.  文章出自网魂工作室http://www.ad0.cn/
C/C++面试题大汇总之微软亚洲技术中心面试题 
2006年10月28日 更新
C/C++面试题大汇总之微软亚洲技术中心面试题:
  1.进程和线程的差别。
  2.测试方法 
  3.Heap与stack的差别。
  4.Windows下的内存是如何管理的?
  5.介绍.Net和.Net的安全性。
  6.客户端如何访问.Net组件实现Web Service?
  7.C/C++编译器中虚表是如何完成的?
  8.谈谈COM的线程模型。然后讨论进程内/外组件的差别。
  9.谈谈IA32下的分页机制
  10.给两个变量,如何找出一个带环单链表中是什么地方出现环的?
  11.在IA32中一共有多少种办法从用户态跳到内核态?
  12.如果只想让程序有一个实例运行,不能运行两个。像winamp一样,只能开一个窗口,怎样实现?
  13.如何截取键盘的响应,让所有的‘a’变成‘b’?
  14.Apartment在COM中有什么用?为什么要引入?
  15.存储过程是什么?有什么用?有什么优点?
  16.Template有什么特点?什么时候用?
  17.谈谈Windows DNA结构的特点和优点。
  18.网络编程中设计并发服务器,使用多进程与多线程 ,请问有什么区别?
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值