经典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...

面试题 相关文章推荐
用JAVA SOCKET编程,读服务器几个字符,再写入本地显示
Nov 25 面试题
使用useBean标志初始化BEAN时如何接受初始化参数
Feb 11 面试题
What is the purpose of Void class? Void类的作用是什么?
Oct 31 面试题
JAVA代码查错题
Oct 10 面试题
SQL Server里面什么样的视图才能创建索引
Apr 17 面试题
STP协议的主要用途是什么?为什么要用STP
Dec 20 面试题
C#如何调用Windows程序打开一个文档
Dec 26 面试题
下列程序在32位linux或unix中的结果是什么
Mar 25 面试题
linux面试题参考答案(10)
Nov 04 面试题
Prototype是怎么扩展DOM的
Oct 01 面试题
如何开发一个JQuery插件
Jul 28 面试题
如何理解transaction事务的概念
May 27 面试题
经典c++面试题四
May 14 #面试题
"引用"与多态的关系
Feb 01 #面试题
将"引用"作为函数返回值类型的格式、好处和需要遵守的规则
Feb 09 #面试题
在什么时候需要使用"常引用"
Dec 31 #面试题
经典c++面试题三
Jul 08 #面试题
经典c++面试题二
Aug 14 #面试题
将"引用"作为函数参数有哪些特点
Apr 05 #面试题
You might like
《Re:从零开始的异世界生活》剧情体验,手游新作定名
2020/04/09 日漫
从康盛产品(discuz)提取出来的模板类
2011/06/28 PHP
在PHP中使用redis
2013/11/04 PHP
php foreach正序倒序输出示例代码
2014/07/01 PHP
php使用正则表达式进行字符串搜索的方法
2015/03/23 PHP
JSON+JavaScript处理JSON的简单例子
2013/03/20 Javascript
利用jQuary实现文字浮动提示效果示例代码
2013/12/26 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
2014/04/16 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
2015/08/25 Javascript
JavaScript 对象字面量讲解
2016/06/06 Javascript
可输入文字查找ajax下拉框控件 ComBox的实现方法
2016/10/25 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
2017/09/27 Javascript
移动端网页开发调试神器Eruda的介绍与使用技巧
2017/10/30 Javascript
微信小程序中进行地图导航功能的实现方法
2018/06/29 Javascript
javacript replace 正则取字符串中的值并替换【推荐】
2018/09/13 Javascript
详解JavaScript中的坐标和距离
2019/05/27 Javascript
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&平移轮播效果
2019/08/16 Javascript
使用next.js开发网址缩短服务的方法
2020/06/17 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
2020/11/03 Javascript
python多线程http下载实现示例
2013/12/30 Python
Python使用MD5加密字符串示例
2014/08/22 Python
详解Python2.x中对Unicode编码的使用
2015/04/03 Python
浅谈python中str字符串和unicode对象字符串的拼接问题
2018/12/04 Python
Python网络爬虫之爬取微博热搜
2019/04/18 Python
Python爬虫动态ip代理防止被封的方法
2019/07/07 Python
Python获取、格式化当前时间日期的方法
2020/02/10 Python
Python读取分割压缩TXT文本文件实例
2020/02/14 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
2020/03/06 Python
pycharm配置python 设置pip安装源为豆瓣源
2021/02/05 Python
使用Python快速打开一个百万行级别的超大Excel文件的方法
2021/03/02 Python
HTML5 Canvas图像模糊完美解决办法
2018/02/06 HTML / CSS
html5 input属性使用示例
2013/06/28 HTML / CSS
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
党的群众路线教育实践活动动员会主持词
2014/03/20 职场文书
音乐幼师求职信
2014/07/09 职场文书
Python 如何实现文件自动去重
2021/06/02 Python