经典c++面试题五


Posted in 面试题 onDecember 17, 2014
46) 位域 :
  有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态,用一位二进 位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区 域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和 位域变量的说明位域定义与结构定义相仿,其形式为:
struct 位域结构名 { 位域列表 }; 其中位域列表的形式为:类型说明符位域名:位域长度
   例如:
  struct bs
  {
   int a:8;
   int b:2;
   int c:6;
  };
  位域变量的说明与结构变量说明的方式相同。可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:
  struct bs
  {
   int a:8;
   int b:2;
   int c:6;
  }data;
  说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明:
  一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:
    struct bs
  {
   unsigned a:4
   unsigned :0
   unsigned b:4
   unsigned c:4
  }
  在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。
  由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。
  位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:
  struct k
  {
   int a:1
   int :2
   int b:3
   int c:2
  };
  从以上分析可以看出,位域在本质上就是一种结构类型,不过其成员是按二进位分配的。
  位域的使用位域的使用和结构成员的使用相同,其一般形式为:位域变量名?位域名位域允许用各种格式输出。
  main()
  {
   struct bs
   {
    unsigned a:1;
    unsigned b:3;
    unsigned c:4;
   }
   bit,*pbit;
   bit.a=1;
   bit.b=7;
   bit.c=15;
   pri
47) 改错:
  #include
  int main(void)
  {
    int **p;
  int arr[100];
    p = &arr;
    return 0;
  }
  解答:搞错了,是指针类型不同,int **p; //二级指针&arr; //得到的是指向第一维为100的数组的指针
   #include
  int main(void)
  {
   int **p, *q;
   int arr[100];
   q = arr;
   p = &q;
   return 0;
  }
48) 下面这个程序执行后会有什么错误或者效果:
  #define MAX 255
  int main()
  {
  unsigned char A[MAX],i;//i被定义为unsigned char
  for (i=0;i  A[i]=i;
return 0;
  }
  解答:死循环加数组越界访问(C/C++不进行数组越界检查)MAX=255 数组A的下标范围为:0..MAX-1,这是其一..
其二.当i循环到255时,循环内执行:A[255]=255;这句本身没有问题..但是返回for (i=0;i 49) struct name1
  {
  char str;
  short x;
  int num;
  }
  struct name2
  {
  char str;
  int num;
  short x;
  }
  sizeof(struct name1)=8,sizeof(struct name2)=12
  在第二个结构中,为保证num按四个字节对齐,char后必须留出3字节的空间;同时为保证整个结构的自然对齐(这里是4字节对齐),在x后还要补齐2个字节,这样就是12字节。
50) intel:
  A.c 和B.c两个c文件中使用了两个相同名字的static变量,编译的时候会不会有问题?这两个static变量会保存到哪里(栈还是堆或者其他的)?
static的全局变量,表明这个变量仅在本模块中有意义,不会影响其他模块。他们都放在数据区,但是编译器对他们的命名是不同的。如果要使变量在其他模块也有意义的话,需要使用extern关键字。

51) struct s1
  {
   int i: 8;
    int j: 4;
    int a: 3;
   double b;
  };
  struct s2
  {
    int i: 8;
    int j: 4;
    double b;
    int a:3;
  };
  printf("sizeof(s1)= %d\n", sizeof(s1));
  printf("sizeof(s2)= %d\n", sizeof(s2));
  result: 16, 24
  第一个struct s1
  {
    int i: 8;
    int j: 4;
    int a: 3;
    double b;
  };
  理论上是这样的,首先是i在相对0的位置,占8位一个字节,然后,j就在相对一个字节的位置,由于一个位置的字节数是4位的倍数,因此不用对 齐,就放在那里了,然后是a,要在3位的倍数关系的位置上,因此要移一位,在15位的位置上放下,目前总共是18位,折算过来是2字节2位的样子,由于 double 是8字节的,因此要在相对0要是8个字节的位置上放下,因此从18位开始到8个字节之间的位置被忽略,直接放在8字节的位置了,因此,总共 是16字节。
  第二个最后会对照是不是结构体内最大数据的倍数,不是的话,会补成是最大数据的倍数。
40. 链表题:一个链表的结点结构
struct Node
{
int data ;
Node *next ;
};
typedef struct Node Node ;
(1)已知链表的头结点head,写一个函数把这个链表逆序 ( Intel)
Node * ReverseList(Node *head) //链表逆序
{
if ( head == NULL || head->next == NULL )
return head;
Node *p1 = head ;
Node *p2 = p1->next ;
Node *p3 = p2->next ;
p1->next = NULL ;
while ( p3 != NULL )
{
p2->next = p1 ;
p1 = p2 ;
p2 = p3 ;
p3 = p3->next ;
}
p2->next = p1 ;
head = p2 ;
return head ;
}
(2)已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序。(保留所有结点,即便大小相同)
Node * Merge(Node *head1 , Node *head2)
{
if ( head1 == NULL)
return head2 ;
if ( head2 == NULL)
return head1 ;
Node *head = NULL ;
Node *p1 = NULL;
Node *p2 = NULL;
if ( head1->data data )
{
head = head1 ;
p1 = head1->next;
p2 = head2 ;
}
else
{
head = head2 ;
p2 = head2->next ;
p1 = head1 ;
}
Node *pcurrent = head ;
while ( p1 != NULL && p2 != NULL)
{
if ( p1->data data )
{
pcurrent->next = p1 ;
pcurrent = p1 ;
p1 = p1->next ;
}
else
{
pcurrent->next = p2 ;
pcurrent = p2 ;
p2 = p2->next ;
}
}
if ( p1 != NULL )
pcurrent->next = p1 ;
if ( p2 != NULL )
pcurrent->next = p2 ;
return head ;
}
(3)已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序,这次要求用递归方法进行。 (Autodesk)
答案:
Node * MergeRecursive(Node *head1 , Node *head2)
{
if ( head1 == NULL )
return head2 ;
if ( head2 == NULL)

return head1 ;
Node *head = NULL ;
if ( head1->data data )
{
head = head1 ;
head->next = MergeRecursive(head1->next,head2);
}
else
{
head = head2 ;
head->next = MergeRecursive(head1,head2->next);
}
return head ;
}
41. 分析一下这段程序的输出 (Autodesk)
class B
{
public:
B()
{
cout }
~B()
{
cout }
B(int i):data(i) //B(int) works as a converter ( int -> instance of B)
{
cout }
private:
int data;
};
B Play( B b)
{
return b ;
}
(1) results:
int main(int argc, char* argv[]) constructed by parameter 5
{ destructed B(5)形参析构
B t1 = Play(5); B t2 = Play(t1);   destructed t1形参析构
return 0;             destructed t2 注意顺序!
} destructed t1
(2) results:
int main(int argc, char* argv[]) constructed by parameter 5
{ destructed B(5)形参析构
B t1 = Play(5); B t2 = Play(10);   constructed by parameter 10
return 0;             destructed B(10)形参析构
} destructed t2 注意顺序!
destructed t1


42. 写一个函数找出一个整数数组中,第二大的数 (Microsoft)
答案:
const int MINNUMBER = -32767 ;
int find_sec_max( int data[] , int count)
{
int maxnumber = data[0] ;
int sec_max = MINNUMBER ;
for ( int i = 1 ; i {
if ( data > maxnumber )
{
sec_max = maxnumber ;
maxnumber = data ;
}
else
{
if ( data > sec_max )
sec_max = data ;
}
}
return sec_max ;
}

43. 写一个在一个字符串(n)中寻找一个子串(m)第一个位置的函数。
KMP算法效率最好,时间复杂度是O(n+m)。

44. 多重继承的内存分配问题:
比如有class A : public class B, public class C {}
那么A的内存结构大致是怎么样的?
这个是compiler-dependent的, 不同的实现其细节可能不同。
如果不考虑有虚函数、虚继承的话就相当简单;否则的话,相当复杂。
45. 如何判断一个单链表是有环的?(注意不能用标志位,最多只能用两个额外指针)
struct node { char val; node* next;}
bool check(const node* head) {} //return false : 无环;true: 有环
一种O(n)的办法就是(搞两个指针,一个每次递增一步,一个每次递增两步,如果有环的话两者必然重合,反之亦然):
bool check(const node* head)
{
if(head==NULL) return 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;
}

Tags in this post...

面试题 相关文章推荐
如何使用PHP session
Apr 21 面试题
为什么使用接口?
Aug 13 面试题
SQL数据库笔试题
Mar 08 面试题
新大陆软件面试题
Nov 24 面试题
XML文档面试题
Aug 05 面试题
用C#语言写出在本地创建一个UDP接收端口的具体过程
Feb 22 面试题
介绍一下grep命令的使用
Jun 28 面试题
Why we need EJB
Oct 20 面试题
我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
Mar 30 面试题
如何清空Session
Feb 23 面试题
Java语言程序设计测试题选择题部分
Apr 03 面试题
一道Delphi面试题
Oct 28 面试题
经典c++面试题四
May 14 #面试题
"引用"与多态的关系
Feb 01 #面试题
将"引用"作为函数返回值类型的格式、好处和需要遵守的规则
Feb 09 #面试题
在什么时候需要使用"常引用"
Dec 31 #面试题
经典c++面试题三
Jul 08 #面试题
经典c++面试题二
Aug 14 #面试题
将"引用"作为函数参数有哪些特点
Apr 05 #面试题
You might like
PHP框架laravel的.env文件配置教程
2017/06/07 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
php实现断点续传大文件示例代码
2020/06/19 PHP
PHP7 错误处理机制修改
2021/03/09 PHP
写js时遇到的一些小问题
2010/12/06 Javascript
20个最新的jQuery插件
2012/01/13 Javascript
jquery中页面Ajax方法$.load的功能使用介绍
2014/10/20 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
javascript格式化json显示实例分析
2015/04/21 Javascript
浅谈JavaScript中setInterval和setTimeout的使用问题
2015/08/01 Javascript
基于Jquery实现万圣节快乐特效
2015/11/01 Javascript
在JavaScript中call()与apply()区别
2016/01/22 Javascript
jQuery实现带水平滑杆的焦点图动画插件
2016/03/08 Javascript
jQuery的事件预绑定
2016/12/05 Javascript
利用Javascript裁剪图片并存储的简单实现
2017/03/13 Javascript
剖析Angular Component的源码示例
2018/03/23 Javascript
element ui 表格动态列显示空白bug 修复方法
2018/09/04 Javascript
微信小程序实现弹出层效果
2020/05/26 Javascript
详解vue中axios的使用与封装
2019/03/20 Javascript
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
[02:09]2018DOTA2亚洲邀请赛TNC赛前采访
2018/04/04 DOTA
[34:44]Liquid vs TNC Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
Python装饰器基础概念与用法详解
2018/12/22 Python
Macbook安装Python最新版本、GUI开发环境、图像处理、视频处理环境详解
2020/02/17 Python
CSS3的颜色渐变效果的示例代码
2017/09/29 HTML / CSS
html5-Canvas可以在web中绘制各种图形
2012/12/26 HTML / CSS
车库门开启器、遥控器和零件:Chamberlain
2019/04/09 全球购物
C#里面可以避免一个类被其他类继承么?如何?
2013/09/26 面试题
银行自荐信范文
2013/10/07 职场文书
计算机网络专业推荐信
2013/11/24 职场文书
学生拾金不昧表扬信
2014/01/21 职场文书
年度考核自我鉴定
2014/02/02 职场文书
对教师的评语
2014/04/28 职场文书
大学生安全责任书
2014/07/25 职场文书
高中生国庆节演讲稿范文2014
2014/09/21 职场文书
导游词之杭州岳王庙
2019/11/13 职场文书