经典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面试题附答案
Jun 05 面试题
类如何去实现接口
Dec 19 面试题
面向对象编程是如何提高软件开发水平的
May 06 面试题
新大陆软件面试题
Nov 24 面试题
介绍一下木马病毒的种类
Jul 26 面试题
进程的查看和调度分别使用什么命令
Mar 25 面试题
软件测试面试题
Jan 05 面试题
什么是SCM(软件配置管理)
Aug 16 面试题
金鑫耀Java笔试题
Sep 06 面试题
Servlet都有哪些方法?主要作用是什么?
Mar 04 面试题
J2ee常用的设计模式?说明工厂模式
May 21 面试题
WSDL的操作类型主要有几种
Jul 19 面试题
经典c++面试题四
May 14 #面试题
"引用"与多态的关系
Feb 01 #面试题
将"引用"作为函数返回值类型的格式、好处和需要遵守的规则
Feb 09 #面试题
在什么时候需要使用"常引用"
Dec 31 #面试题
经典c++面试题三
Jul 08 #面试题
经典c++面试题二
Aug 14 #面试题
将"引用"作为函数参数有哪些特点
Apr 05 #面试题
You might like
《神奇女侠:血脉》神力女超人大战犯罪公司
2020/04/09 欧美动漫
3.从实例开始
2006/10/09 PHP
PHP实现无限极分类图文教程
2014/11/25 PHP
php读取mssql的ntext字段返回值为空的解决方法
2014/12/30 PHP
深入讲解PHP Session及如何保持其不过期的方法
2015/08/18 PHP
php实现zip文件解压操作
2015/11/03 PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
2018/01/29 PHP
javascript Array.prototype.slice使用说明
2010/10/11 Javascript
asp.net中System.Timers.Timer的使用方法
2013/03/20 Javascript
javascript解决innerText浏览器兼容问题思路代码
2013/05/17 Javascript
javascript实现五星评价代码(源码下载)
2015/08/11 Javascript
jQuery回到顶部的代码
2016/07/09 Javascript
用vue构建多页面应用的示例代码
2017/09/20 Javascript
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
vue实现配置全局访问路径头(axios)
2019/11/01 Javascript
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
Django中使用Celery的方法示例
2018/11/29 Python
Python给定一个句子倒序输出单词以及字母的方法
2018/12/20 Python
Python读取文件内容为字符串的方法(多种方法详解)
2020/03/04 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
Python3标准库之threading进程中管理并发操作方法
2020/03/30 Python
Python运行提示缺少模块问题解决方案
2020/04/02 Python
python可以用哪些数据库
2020/06/22 Python
解决python对齐错误的方法
2020/07/16 Python
Python Pillow(PIL)库的用法详解
2020/09/19 Python
利用css3-animation实现逐帧动画效果
2016/03/10 HTML / CSS
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
蔻驰法国官网:COACH法国
2018/11/14 全球购物
期末总结的个人自我评价
2013/11/02 职场文书
车工岗位职责
2013/11/26 职场文书
酒店总经理欢迎词
2014/01/15 职场文书
管理专员自荐信
2014/01/26 职场文书
2014年党员评议表自我评价
2014/09/27 职场文书
入党宣誓大会后的感想
2015/08/10 职场文书
2016秋季运动会前导词
2015/11/25 职场文书
SpringBoot 拦截器妙用你真的了解吗
2021/07/01 Java/Android