




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、经典C+面试题五46)位域:有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1两种状态,用一位二进 位即可。为了节省存储空间,并使处理简便,C 语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域” 是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就 可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和 位域变量的说明位域定义与结构定义相仿,其形式为:struct位域结构名位域列表;其中位域列表的形式为:类型 说明符位域名:位域长度例如:struc
2、t bsint a:8;int b:2;int c:6;;位域变量的说明与结构变量说明的方式相同。可采用先定义后i说明,同时定义说明或者直接说明这三种方式。例如:struct bsint a:8;int b:2;int c:6;data;说明data为bs变量,共占两个字节。其中位域a占8位,位 域b占2位,位域c占6位。对于位域的定义尚有以下几点说明:一个位域必须存储在同一个字节中,不能跨两个字节。如一个 字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:struct bsun sig ned a:4un sig ned :0un sig ne
3、d b:4un sig ned c:4在这个位域定义中,a占第一字节的4位,后4位填0表示不 使用,b从第二字节开始,占用4位,c占用4位。由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位位域可以无位域名,这时它只用来作填充或调整位置。无名的 位域是不能使用的。例如:struct kint a:1int :2int b:3int c:2;从以上分析可以看出,位域在本质上就是一种结构类型,不过 其成员是按二进位分配的。位域的使用位域的使用和结构成员的使用相同,其一般形式为:位域变量名 位域名位域允许用各种格式输出。mai n()struct bsun s
4、ig ned a:1;un sig ned b:3;un sig ned c:4;3bit,*pbit;bit.a=1;bit.b=7;bit.c=15;pri47) 改错:#i ncludeint main(v oid)int *p;int arr100;P =return 0;解答:搞错了,是指针类型不同,int *p; /二级指针/得到的是 指向第一维为100的数组的指针#i ncludeint main(v oid)int *p, *q;q = arr;p =return 0;48) 下面这个程序执行后会有什么错误或者效果:#define MAX 255int mai n()unsig
5、ned char AMAX,i;/i被定义为 unsigned charfor (i=0;iAi=i;return 0;解答:死循环加数组越界访问(C/C+不进行数组越界检查)MAX=255 数组A的下标范围为:0.MAX-1,这是其一.其二当i循环到255时,循环内执行:A255=255;这句本身没有问题但是返回for (i=0;i49) struct n ame1char str;short x;int num;#struct n ame2char str;int num;short x;sizeof(struct n ame1)=8,sizeof(struct n ame2)=12在第二
6、个结构中,为保证num按四个字节对齐,char后必须 留出3字节的空间;同时为保证整个结构的自然对齐(这里是 4字 节对齐),在x后还要补齐2个字节,这样就是12字节。50) intel :A.c和B.c两个c文件中使用了两个相同名字的static变量编 译的时候会不会有问题 这两个static变量会保存到哪里(栈还是堆 或者其他的)static的全局变量,表明这个变量仅在本模块中有意义,不会影 响其他模块。他们都放在数据区,但是编译器对他们的命名是不同的。 如果要使变量在其他模块也有意义的话,需要使用extern关键字。51) struct s1int i: 8;int a: 3;doubl
7、e b;;struct s2int i: 8;int j: 4;double b;int a:3;prin tf(sizeof(s1)= %dn, sizeof(sl);prin tf(sizeof(s2)= %dn, sizeof(s2);result: 16, 24第一个 struct s1int i: 8;int j: 4;int a: 3;double b;理论上是这样的,首先是i在相对0的位置,占8位一个字节,然后,j就在相对一个字节的位置,由于一个位置的字节数是4位的倍数,因此不用对 齐,就放在那里了,然后是 a,要在3位的倍数关系的位置上,因此要移一位,在 15位的位置上放下,目
8、前总共是 18位,折算过来是2字节2位的样子,由于double是8字节的, 因此要在相对0要是8个字节的位置上放下,因此从18位开始到8 个字节之间的位置被忽略,直接放在8字节的位置了,因此,总共 是 16字节。第二个最后会对照是不是结构体内最大数据的倍数,不是的话,会补成是最大数据的倍数。40. 链表题:一个链表的结点结构struct Nodeint data ;Node *n ext ;typedef struct Node Node ;(1) 已知链表的头结点head,写一个函数把这个链表逆序(In tel)Node * ReverseList(Node *head) / 链表逆序if
9、( head = NULL | head- next = NULL )retur n head;Node *p1 = head ;Node *p2 = p1- next ;Node *p3 = p2- next ;p1- next = NULL ;while ( p3 != NULL )p2-n ext = pl ;pl = p2 ;p2 = p3 ;p3 = p3-n ext ;p2-n ext = pl ;head = p2 ;retur n head ;(2) 已知两个链表headl和head2各自有序,请把它们合并成 一个链表依然有序。(保留所有结点,即便大小相同)Node * Mer
10、ge(Node *head1 , Node *head2)if ( head1 = NULL)retur n head2 ;if ( head2 = NULL)retur n head1 ;Node *head = NULL ;Node *p1 = NULL;9Node *p2 = NULL;if ( head1-data data )head = headl ;pl = headl- n ext;p2 = head2 ;elsehead = head2 ;p2 = head2-n ext ;pl = headl ;Node *pcurre nt = head ;while ( pl != N
11、ULL & p2 != NULL)if ( p1-data data )pcurre nt-n ext = p1 ;pcurre nt = p1 ;p1 = p1- n ext ;elsepcurre nt-n ext = p2 ;pcurre nt = p2 ;p2 = p2-n ext ;if ( pl != NULL )pcurre nt-n ext = pl ;if ( p2 != NULL )pcurre nt-n ext = p2 ;retur n head ;(3) 已知两个链表headl和head2各自有序,请把它们合并成 一个链表依然有序,这次要求用递归方法进行。(Autod
12、esk)答案:Node * MergeRecursive(Node *head1 , Node *head2)if ( headl = NULL )retur n head2 ;if ( head2 = NULL)retur n headl ;Node *head = NULL ;if ( head1-data data )head = headl ;head-next = MergeRecursive(head1- n ext,head2);elsehead = head2 ;head-next = MergeRecursive(head1,head2-n ext);retur n head
13、 ;41. 分析一下这段程序的输出(Autodesk)class Bpublic:B()coutB()coutB(int i):data(i) B(int)works as a converter( int -in sta nee of B)coutprivate:int data;;B Play( B b)return b ;(1) results:int main (i nt argc, char* argv) con structed by parameter 5 destructed B(5)形参析构B t1 = Play(5); B t2 = Play(t1); destructed
14、 t1 形参析构return 0; destructed t2注意顺序! destructed t1(2) results:int main (i nt argc, char* argv) con structed by parameter 5 destructed B(5)形参析构10B t1 = Play(5); B t2 = Play(10); con structed by parameterreturn 0; destructed B(10) 形参析构 destructed t2注意顺序!destructed t142. 写一个函数找出一个整数数组中,第二大的数(Microsoft
15、) 答案:con st int MINNUMBER = -32767 ;int fin d_sec_max( int data , int count)int maxnu mber = data0;int sec_max = MINNUMBER ;for ( int i = 1 ; iif ( data maxnu mber )sec_max = maxnu mber ;maxnu mber = data ;elseif ( data sec_max )sec_max = data ;retur n sec_max ;43. 写一个在一个字符串(n)中寻找一个子串(m)第一个位置的 函数。KM
16、P算法效率最好,时间复杂度是O (n+m)。44. 多重继承的内存分配问题:比如有 class A : public class B, public class C 那么A的内存结构大致是怎么样的?这个是compiler-dependent的,不同的实现其细节可能不同。如果不考虑有虚函数、虚继承的话就相当简单;否则的话,相当 复杂。45. 如何判断一个单链表是有环的?(注意不能用标志位,最多 只能用两个额外指针)struct node char val; no de* n ext;bool check(c onst no de* head) /retur n false :无环;true:有环一种0 (n)的办法就是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智能制造项目共同担保责任保证合同
- 商业车库使用权转让合同
- 小学语文教研组工作计划10篇
- 2024年金华市永康市园林管理处招聘笔试真题
- 2025喜迎中秋演讲稿(4篇)
- 6.6爱眼日宣传活动工作总结(27篇)
- 宿舍安全巡查管理制度
- 合同审查层级管理制度
- 一线人员专业制度部分复习测试卷
- 中医诊断学理论知识测试题库
- 散粮装卸工艺
- 中华人民共和国产品质量法培训
- 餐厅干股分红协议书
- 医院手术室净化装修方案
- 气压传动课件 项目九任务二 气-液动力滑台气动系统故障分析与维护
- 2024年海南省高考地理试卷(含答案)
- 《排球正面双手垫球 移动垫球》教案
- 《菊次郎的夏天》电影赏析
- 课件:《中华民族共同体概论》第十五讲:新时代与中华民族共同体建设
- 汽车刹车片与刹车盘检测考核试卷
- 2024年海南省中考历史试题
评论
0/150
提交评论