C++面试题

当前位置: 面试问题网 > C++面试题 > 经典c++面试题五

经典c++面试题五

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;inext ;
   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 < head2->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 < head2->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()
   {
   coutnext->next;
   if(low==fast) return true;
   }
   return false;
   }

【经典c++面试题五】相关文章

1. 经典c++面试题五

2. 经典c++面试题六

3. 经典c++面试题四

4. 经典c++面试题三

5. 经典c++面试题二

6. 经典C++面试题一

7. PHP经典面试题

8. C和C++经典笔试题附答案解析

9. 面试官点评面试之经典错误

10. 一家外企的面试题目(C/C++面试题,C语言面试题)

本文来源:https://www.mianshiwenti.com/a13061.html

点击展开全部

《经典c++面试题五》

将本文的Word文档下载到电脑,方便收藏和打印

推荐程度:

进入下载页面

﹝经典c++面试题五﹞相关内容

「经典c++面试题五」相关专题

其它栏目

也许您还喜欢