经典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面试题及答案-填空题
Apr 26 面试题
Yahoo-PHP面试题2
Dec 06 面试题
JMS中Topic和Queue有什么区别
May 15 面试题
新电JAVA笔试题目
Aug 31 面试题
SQL面试题
Apr 30 面试题
几个数据库方面的面试题
Jul 01 面试题
阿里巴巴的Oracle DBA笔试题答案-SQL tuning类
Apr 03 面试题
Net Remoting把服务器端激活两种模式
Jan 22 面试题
linux面试题参考答案(10)
Oct 26 面试题
Linux文件操作命令都有哪些
Feb 27 面试题
UNIX文件系统分类
Nov 11 面试题
Delphi笔试题
Nov 14 面试题
经典c++面试题四
May 14 #面试题
"引用"与多态的关系
Feb 01 #面试题
将"引用"作为函数返回值类型的格式、好处和需要遵守的规则
Feb 09 #面试题
在什么时候需要使用"常引用"
Dec 31 #面试题
经典c++面试题三
Jul 08 #面试题
经典c++面试题二
Aug 14 #面试题
将"引用"作为函数参数有哪些特点
Apr 05 #面试题
You might like
字母顺序颠倒而单词顺序不变的php代码
2010/08/08 PHP
CI框架中集成CKEditor编辑器的教程
2014/06/09 PHP
jQuery Mobile + PHP实现文件上传
2014/12/12 PHP
PHP实现的DES加密解密实例代码
2016/04/06 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
2016/05/27 PHP
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
2011/08/28 Javascript
jQuery中的jQuery()方法用法分析
2014/12/27 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
2016/06/25 Javascript
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
2020/06/17 Javascript
node.js的http.createServer过程深入解析
2019/06/06 Javascript
js实现点击图片在屏幕中间弹出放大效果
2019/09/11 Javascript
在VUE中实现文件下载并判断状态的方法
2019/11/08 Javascript
JavaScript中的函数申明、函数表达式、箭头函数
2019/12/06 Javascript
JS实现图片切换特效
2019/12/23 Javascript
Node.js API详解之 repl模块用法实例分析
2020/05/25 Javascript
详解JS函数防抖
2020/06/05 Javascript
vue 实现element-ui中的加载中状态
2020/11/11 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
[00:37]2016完美“圣”典风云人物:rOtk宣传片
2016/12/09 DOTA
[01:11:11]Alliance vs RNG 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Python的Flask框架中实现登录用户的个人资料和头像的教程
2015/04/20 Python
python在非root权限下的安装方法
2018/01/23 Python
利用Python求阴影部分的面积实例代码
2018/12/05 Python
Python中调用其他程序的方式详解
2019/08/06 Python
python help函数实例用法
2020/12/06 Python
精选奢华:THE LIST
2019/09/05 全球购物
Traffic People官网:女式花裙、上衣和连身裤
2020/10/12 全球购物
高三自我评价
2014/02/01 职场文书
电气自动化专业职业规划范文
2014/02/16 职场文书
高考标语大全
2014/06/05 职场文书
缅怀先烈演讲稿
2014/09/03 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
机关作风建设整改方案
2014/10/27 职场文书
群众路线自查报告及整改措施
2014/11/04 职场文书
2015年医院药剂科工作总结
2015/05/04 职场文书
党支部半年考察意见
2015/06/01 职场文书