程序员面试宝典.pdf

上传人:qwe****56 文档编号:70344913 上传时间:2023-01-19 格式:PDF 页数:212 大小:1.38MB
返回 下载 相关 举报
程序员面试宝典.pdf_第1页
第1页 / 共212页
程序员面试宝典.pdf_第2页
第2页 / 共212页
点击查看更多>>
资源描述

《程序员面试宝典.pdf》由会员分享,可在线阅读,更多相关《程序员面试宝典.pdf(212页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、 程序员面霸手册程序员面霸手册程序员面霸手册程序员面霸手册 VER 1.3 黄优黄优黄优黄优 2009.10 3前前前前 言言言言 本人计算机专业毕业,找工作厉尽艰辛,面尽无数公司,深感怀才不遇,整理前人心血,以成此书。为了让后人少走我的路,把自己遇到的一些问题,以及网上一些朋友的程序员面试笔试题以及一些在面试笔试中的重要知识点都写出来同大家分享。其中有些题目已经做了答案,而有些答案在后边的知识点里已经注明,要读者自行寻找。把这些题目和知识点整理成本册子,欢迎大家来信推荐一些在自己面试笔试中遇到的问题,以完善此书,不胜感激。此书闲来所做,只期望能对后来者起到一定帮助。此电子版,免费无限分发,请

2、勿用于商业目的,违者必究。如果你觉得好的话,将他分享给更多的朋友朋友。书中难免出现错误和不足,还望不吝赐教,如果你在笔试或者面试中遇到了此册中没有遇到的问题,可以发电子邮件或者在本书官网给我留言,希望能把大家遇到的问题收集在一起,不胜感激。希望大家一起交流,大家帮大家,大家都能找到一个自己喜欢和满意的工作。我的电子邮件:,QQ,QQ,QQ,QQ:1:1:1:1140603739140603739140603739140603739,本书永久性官网:httphttphttphttp:/ 处获取本书所有信息。2009.3 黄黄黄黄优优优优于西安于西安于西安于西安 4版权声明版权声明版权声明版权声明

3、 此书之电子版免费,可任意分发传播,但需保持本书完整性,书中内容禁止用于商业目的,如需要修改或因商业目的使用本书需联系作者本人,email:。未经授权非法利用本书用于商业目的将受严厉惩处。5版版版版本本本本更新更新更新更新说明说明说明说明 版本版本版本版本 更更更更新内容新内容新内容新内容 备注备注备注备注 v1.0(09.03)无 创建 v1.1(09.04)1.增加了操作系统部分。2.数据结构部分增加了 ADT 的实现代码。3.数据结构部分增加了 KMP 排序算法。4.增加附录一 ASCII 码表。5.增加了附录二 ADO.NET 连接字符串。6.增加了附录二 ADO.NET 连接字符串。

4、7.第四部分增加使用.NET 访问 MySql 数据库。8.java 有几道题目做了答案。9.数据库部分新增几道华为公司问答题目。10.修正一些小的疏忽和错误。更新及维护 v1.2 1.对知识点精华部分做了索引,方便信息查阅,并且对原来档案做了简化,以保持本书的简单易读性。2.整理内容,对内容进行了详细分类,并修改了分类,使框架简明易懂。更改 v1.2(09.10)1.修正了书中部分错误。2.补充部分答案。6目 录 第一部分 数据结构.7 A.笔试面试题集.7 B.知识点精华.17 第二部分 C/C+.26 A.笔试面试题集.26 B.知识点精华.84 第三部分 JAVA.103 A.笔试面试

5、题集.103 B.知识点精华.129 第四部分.NET.137 A.笔试面试题集.137 B.知识点精华.146 第五部分 数据库.179 A.笔试面试题集.179 B.知识点精华.192 第六部分 操作系统.203 A.笔试面试题集.203 附录一 ASCII码表.212 7 第一部分第一部分第一部分第一部分 数据结构数据结构数据结构数据结构 A.笔试面试题集笔试面试题集笔试面试题集笔试面试题集 1.在一个单链表中 p 所指结点之前插入一个 s(值为 e)所指结点时,可执行如下操作:q=head;while(q-next!=p)q=q-next;s=new Node;s-data=e;q-n

6、ext=_ s_;s-next=_ p_;备注:此题在以前版本中有错误,多谢朋友们指正。2.线性表的顺序存储结构是一种 A 的存储结构,而链式存储结构是一种 C 的存储结构。A随机存取 B索引存取 C顺序存取 D散列存取 3.线性表若采用链式存储结构时,要求内存中可用存储单元的地址_D _。A.必须是连续的 B.部分地址必须是连续的 C.一定是不连续的 D.连续或不连续都可以 4.在一个单链表中,已知 q 所指结点是 p 所指结点的前驱结点,若在 q 和 p 之间插入 s结点,则执行_。A.s-next=p-next;p-next=s;B.p-next=s-next;s-next=p;C.q-

7、next=s;s-next=p;D.p-next=s;s-next=q;5.在一个单链表中,若p所指结点不是最后结点,在p之后插入s所指结点,则执行 。A.s-next=p;p-next=s;B.s-next=p-next;p-next=s;C.s-next=p-next;p=s;C.p-next=s;s-next=p;6.在一个单链表中,若删除 p 所指结点的后续结点,则执行 。A.p-next=p-next-next;B.p=p-next;p-next=p-next-next;C.p-next=p-next;D.p=p-next-next;7.链表不具备的特点是_A_。A 可随机访问任何一

8、个元素 B 插入、删除操作不需要移动元素 C 无需事先估计存储空间大小 D 所需存储空间与线性表长度成正比 8注:链表是顺序结构,必须顺序访问。8.以下关于线性表的说法不正确的是 。A 线性表中的数据元素可以是数字、字符、记录等不同类型。B 线性表中包含的数据元素个数不是任意的。C 线性表中的每个结点都有且只有一个直接前趋和直接后继。D 存在这样的线性表:表中各结点都没有直接前趋和直接后继。9.在一个长度为 n 的顺序表中删除第 i 个元素,要移动 n-i 个元素。如果要在第 i 个元素前插入一个元素,要后移 n-i+1 个元素。10.栈操作数据的原则是 后进先出,队列操作数据的原则是 先进先

9、出。11.在栈中,可进行插入和删除操作的一端称 栈顶。12.栈和队列都是_非线性_结构;对于栈只能在 栈顶 插入和删除元素;对于队列只能在_队头_插入元素和 队尾 删除元素。13.通常采用的两种存储结构是 和 。14.计算机在运行递归程序时,要用到 编译器 提供的栈。15.一个栈的入栈序列 a,b,c,d,e,则栈的不可能的输出序列是_ C 。A.edcba B.decba C.dceab D.abcde 注:此题的难点在于不必考虑完全入完后再出栈,可以边入边出,也可以入几个再出。16.一个队列的数据入列序列是 1,2,3,4,则队列的出队时输出序列是_ B _。A.4,3,2,1 B.1,2

10、,3,4 C.1,4,3,2 D.3,2,4,1 17.判断一个表达式中左右括号是否匹配,采用 _D_ 实现较为方便。A 线性表的顺序存储 B 队列 C 线性表的链式存储 D 栈 18.栈与一般线性表区别主要在方面 C。A 元素个数 B 元素类型 C 逻辑结构 D 插入、删除元素的位置 19.“假上溢”现象会出现在 D 中。A 循环队列 B 队列 C 链队列 D 顺序队列 注:假上溢是由于头尾指针不断前移超出向量空间。20.在一个链队中,假设 F 和 R 分别是队首和队尾指针,则删除一个结点的运算是 C 。A R=F-next;B R=R-next;C F=F-next;D F=R-next;

11、21.表达式 a*(b+c)-d 的后缀表达式是 B。Aabcd*+-B.abc+*d-C.abc*+d-D.-+*abcd 9 注:-a(b+c)*d-abc*+d-22.判断链表是否存在环型链表问题:判断一个链表是否存在环,例如下面这个链表就存在一个环:例如 N1-N2-N3-N4-N5-N2 就是一个有环的链表,环的开始结点是 N5 这里有一个比 较简单的解法。设置两个指针 p1,p2。每次循环 p1 向前走一步,p2 向前走两步。直到 p2 碰到 NULL 指针或者两个指针相等结束循环。如果两个指针相等则说明存在环。struct link int data;link*next;bool

12、 IsLoop(link*head)link*p1=head,*p2=head;if(head=NULL|head-next=NULL)/该链表没有节点或者只有一个节点,则不用判断.return false;/先循环,再判断 do p1=p1-next;/p1 前进一步 p2=p2-next-next;/p2 前进一步 while(p2&p2-next&p1!=p2);/p2 不为空,p2 的下个节点不为空,p1 不等于 p2 继续循环,否则退出。/p2 为空则 p1p2 不相等则不存在环,p1=p2 则存在环 if(p1=p2)return true;else return false;23

13、.链表反转 单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。比如一个链表是这样的:1-2-3-4-5 通过反转后成为 5-4-3-2-1。最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。源代码如下:struct linka int data;linka*next;10 void reverse(linka*&head)if(head=NULL)/链表为空 return;linka*pre,*cur,*ne;pre=head;cur=head-next;while(cur

14、)ne=cur-next;cur-next=pre;pre=cur;cur=ne;head-next=NULL;head=pre;还有一种利用递归的方法。这种方法的基本思想是在反转当前节点之前先调用递归 函数反转后续节点。源代码如下。不过这个方法有一个缺点,就是在反转后的最后 一个结点会形成一个环,所以必须将函数的返回的节点的 next 域置为 NULL。因为 要 改变 head 指针,所以我用了引用。算法的源代码如下:linka*reverse(linka*p,linka*&head)if(p=NULL|p-next=NULL)head=p;return p;else linka*tmp=r

15、everse(p-next,head);tmp-next=p;return p;24.判断两个数组中是否存在相同的数字 给定两个排好序的数组,怎样高效得判断这两个数组中存在相同的数字?这个问题首先最直接能想到的是一个 O(nlogn)的算法。就是任意挑选一个数组,遍历 这个数组的所有元素,遍历过程中,在另一个数组中对第一个数组中的每个元素进行 binary search。用 C+实现代码如下:bool findcommon(int a,int size1,int b,int size2)int i;11 for(i=0;isize1;i+)int start=0,end=size2-1,mid

16、;while(start=end)mid=(start+end)/2;if(ai=bmid)return true;else if(aibmid)end=mid-1;else start=mid+1;return false;有一个 O(n)算法。首先设两个下标,分别初始化为两个数组的起始地址,依次向 前推进。推进的规则是比较两个数组中的数字,小的那个数组的下标向前推进一步,直到任何一个数组的下标到达数组末尾时,如果这时还没碰到相同的数字,说明数组 中没有相同的数字。bool findcommon2(int a,int size1,int b,int size2)int i=0,j=0;whi

17、le(isize1&jbj)j+;if(aibj)i+;return false;25.最大子序列问题:给定一整数序列 A1,A2,.An(可能有负数),求 A1An 的一个子序列 AiAj,使 得 Ai 到 Aj 的和最大 例如:整数序列-2,11,-4,13,-5,2,-5,-3,12,-9 的最大子序列的和为 21。对于这个问题,最简单也是最容易想到的那就是穷举所有子序列的方法。利用三重循环,依次求出所有子序列的和然后取最大的那个。当然算法复杂度会达到 O(n3)。显然这 种方法不是最优的,下面给出一个算法复杂度为 O(n)的线性算法实现,算法的来源于 Programming Pearl

18、s 一书。在给出线性算法之前,先来看一个对穷举算法进行优化的 12 算法,它的算法复杂度为 O(n2)。其实这个算法只是对对穷举算法稍微做了一些修改:其实子序列的和我们并不需要每次都重新计算一遍。假设 Sum(i,j)是 Ai.Aj 的和,那么 Sum(i,j+1)=Sum(i,j)+Aj+1。利用这一个递推,我们就可以得到 下面这个算法:int max_sub(int a,int size)int i,j,v,max=a0;for(i=0;isize;i+)v=0;for(j=i;jmax)max=v;return max;那怎样才能达到线性复杂度呢?这里运用动态规划的思想。先看一下源代码实

19、现:int max_sub2(int a,int size)int i,max=0,temp_sum=0;for(i=0;imax)max=temp_sum;else if(temp_sumnext=NULL)return head;do p1=p1-next;p2=p2-next-next;while(p2&p2-next);return p1;27.已知一个单向链表的头,请写出删除其某一个结点的算法,要求,先找到此结点,然后删除。slnodetype*Delete(slnodetype*Head,int key)中 if(Head-number=key)Head=Pointer-next;

20、free(Pointer);break;Back=Pointer;Pointer=Pointer-next;if(Pointer-number=key)Back-next=Pointer-next;free(Pointer);break;void delete(Node*p)if(Head=Node)while(p)28.判断一个字符串是不是回文 int IsReverseStr(char*aStr)int i,j;int found=1;if(aStr=NULL)return-1;j=strlen(aStr);for(i=0;ij/2;i+)if(*(aStr+i)!=*(aStr+j-i-

21、1)found=0;14 break;return found;注:回文是指某个串或者数字无论从左向右还是从右向左都一样。29.用两个栈实现一个队列的功能?要求给出算法和思路!设 2 个栈为 A,B,一开始均为空 入队:将新元素 push 入栈 A;出队:(1)判断栈 B 是否为空;(2)如果不为空,则将栈 A 中所有元素依次 pop 出并 push 到栈 B;(3)将栈 B 的栈顶元素 pop 出。30.Josephu 问题为:设编号为 1,2,n 的 n 个人围坐一圈,约定编号为 k(1=k=n)的人从 1 开始报数,数到 m 的那个人出列,它的下一位又从 1 开始报数,数到 m 的那个人

22、又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。数组实现:#include#include int Josephu(int n,int m)int flag,i,j=0;int*arr=(int*)malloc(n*sizeof(int);for(i=0;i n;+i)arri=1;for(i=1;i n;+i)flag=0;while(flag m)if(j=n)j=0;if(arrj)+flag;+j;arrj-1=0;printf(第%4d 个出局的人是:%4d 号n,i,j);free(arr);return j;15 int main()int n,m;scanf(

23、%d%d,&n,&m);printf(最后胜利的是%d 号!n,Josephu(n,m);system(pause);return 0;链表实现:#include#include typedef struct Node int index;struct Node*next;JosephuNode;int Josephu(int n,int m)int i,j;JosephuNode*head,*tail;head=tail=(JosephuNode*)malloc(sizeof(JosephuNode);for(i=1;i index=i;tail-next=(JosephuNode*)mal

24、loc(sizeof(JosephuNode);tail=tail-next;tail-index=i;tail-next=head;for(i=1;tail!=head;+i)for(j=1;j next;tail-next=head-next;printf(第%4d 个出局的人是:%4d 号n,i,head-index);free(head);head=tail-next;i=head-index;free(head);return i;16 int main()int n,m;scanf(%d%d,&n,&m);printf(最后胜利的是%d 号!n,Josephu(n,m);syste

25、m(pause);return 0;31.排序二叉树插入一个节点或双向链表的实现 32.问答题:1)什么是平衡二叉树?左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于 1 2)堆栈溢出一般是由什么原因导致的?没有回收垃圾资源 3)数组和链表的区别 数组:数据顺序存储,固定大小 链表:数据可以随机存储,大小可动态改变 4)冒泡排序算法的时间复杂度是什么?O(n2)17 B.知识点精华知识点精华知识点精华知识点精华 1.big endian,little endian big endian 是指低地址存放最高有效字节(MSB),而 little endian 则是低地址存放最低有效字节(

26、LSB)。比如数字 0 x12345678 在两种不同字节序 CPU 中的存储顺序如下所示:Big Endian 低地址 高地址 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|12|34|56|78|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+Little Endian 低地址 高地址 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|78|56|34|12|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+CPU 存储一个字节的数据时其字节内的 8 个比特之间的顺序是否也有 bi

27、g endian 和 little endian 之分?或者说是否有比特序的不同?实际上,这个比特序是同样存在的。下面以数字 0 xB4(10110100)用图加以说明。Big Endian msb lsb -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|1|0|1|1|0|1|0|0|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+Little Endian lsb msb -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|0|0|1|0|1|1|0|1|+-+-+-+-+-+-+-+

28、-+-+-+-+-+-+-+-+-+-+-+-+-+2.ADT(抽象数据类型抽象数据类型抽象数据类型抽象数据类型 C 语言语言语言语言实现实现实现实现)#define ERROR 0 18#define OK 1 struct STU char name20;char stuno10;int age;int score;stu50;struct LIST struct STU stu50;int length;L;int printlist(struct LIST L)int i;printf(name stuno age scoren);for(i=0;iL.length;i+)printf

29、(%s%st%dt%dn,L.stui.name,L.stui.stuno,L.stui.age,L.stui.score);printf(n);int listinsert(struct LIST*L,int i,struct STU e)struct STU*p,*q;if(iL-length+1)return ERROR;q=&(L-stui-1);for(p=&L-stuL-length-1;p=q;-p)*(p+1)=*p;*q=e;+L-length;return OK;/*ListInsert Before i*/main()struct STU e;L.length=0;str

30、cpy(e.name,zmofun);strcpy(e.stuno,100001);e.age=80;e.score=1000;listinsert(&L,1,e);printlist(L);printf(List length now is%d.nn,L.length);strcpy(e.name,bobjin);strcpy(e.stuno,100002);19 e.age=80;e.score=1000;listinsert(&L,1,e);printlist(L);printf(List length now is%d.nn,L.length);3.KMP 排序算法排序算法排序算法排序

31、算法 C 语言源代码语言源代码语言源代码语言源代码#include#include int index_KMP(char*s,char*t,int pos);void get_next(char*t,int*next);char s10=abcacbcba;char t4=bca;int next4;int pos=0;int main()int n;get_next(t,next);n=index_KMP(s,t,pos);printf(%d,n);return 0;int index_KMP(char*s,char*t,int pos)int i=pos,j=1;while(i=(int)

32、strlen(s)&j(int)strlen(t)return i-strlen(t)+1;else 20 return 0;void get_next(char*t,int*next)int i=1,j=0;next0=next1=0;while(i(int)strlen(t)if(j=0|ti=tj)i+;j+;nexti=j;else j=nextj;4.堆与栈堆与栈堆与栈堆与栈 void f()int*p=new int5;这条短短的一句话就包含了堆与栈,看到 new,我们首先就应该想到,我们分配了一块堆内存,那么指针 p 呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放

33、了一个指向一块堆内存的指针 p。在程序会先确定在堆中分配内存的大小,然后调用 new()分配内存,然后返回这块内存的首地址,放入栈中。堆和栈的主要区别:1)管理方式:栈由编译器自动管理,无需手工控制;堆由程序员控制,如果不加以干预会造成内存泄露。2)空间大小:在 32 位系统下,堆内存可以达到 4G 的空间,也就是说堆可以使用几乎所有内存空间。但栈都是有一定的空间大小的,一般都可以在编译器中进行设置。3)碎片问题:对堆的 new/delete 操作会造成内存空间的不连续,从而造成大量的内存碎片,使程序效率降低。栈则不会存在这个问题,因为栈是先进后出的,不可能有一个内存块从栈中间弹出,因而不会造

34、成碎片。4)生长方向:21 堆是向着内存地址增加的方向;栈向着内存地址减小的方向增长。5)分配方式:堆都是动态分配的,没有静态分配的堆。栈有 2 种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由 alloca 函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需手工操作。6)分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是 C/C+函数库提供的,它的机制是很复杂的,堆的效率比栈要低得多。无论是堆还是栈,都要防止越界现象的发

35、生),因为越界的结果要么是程序崩溃,要么是摧毁程序的堆、栈结构,产生以想不到的结果。5.约瑟夫环约瑟夫环约瑟夫环约瑟夫环 用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至最后一个元素并输出该元素的值。写出C程序。其实现代码如下(在READHAT9.0 LINUX下测试通过):/*文件名:game_ouputnum.h*文件描述:给定M,N值,从1至N开始顺序循环数数,每数到M,把该M去掉,继续直到最后一个元数并输出该无数 使用循环链表实现.*/#include#include /*N 值 */#define NUM 8#define OK 1#define ERROR-1/

36、*M 值*/#define NEXT 3 typedef struct int data;struct list*next;list;/*函数名:list*createList()*参 数:无*功能描述:创建一个循环链表*返回值:成功返回链表的首指针,失败返回-1*/list*createList()22 list*head=NULL;list*tail=NULL,*temp=NULL;int i=0;head=(struct list*)malloc(sizeof(list);if(head=NULL)printf(malloc space failed!n);return ERROR;he

37、ad-data=1;head-next=head;tail=head;for(i=2;idata=i;temp-next=head;tail-next=temp;tail=temp;return head;/*函数名:void printList(list*head)*参 数:链表的首地址*功能描述:打印出链表中所有的数据*/void printList(list*head)list*pList=NULL;pList=head;if(head=NULL)printf(printList param invalid!n);while(head-next!=pList)printf(this da

38、ta is:%dn,head-data);23 head=head-next;printf(the data is:%dn,head-data);return;/*函数名:int getLastElem(list*pList)*参 数:链表的首地址*功能描述:开始顺序循环数数,得到最后一个元素的值.*返回值:正确返回最后一个元素的值,错误返回*/int getLastElem(list*pList)list*head=NULL,*temp=NULL;int i=1;if(pList=NULL)printf(getLastElem param invalidn);return ERROR;hea

39、d=temp=pList;while(head!=head-next)if(i=NEXT)temp=head;head=head-next;free(temp);pList-next=head;temp=NULL;i=1;else pList=head;head=head-next;i+;printf(get lastElem:%dn,head-data);return head-data;int main()24 list*pList=NULL;pList=createList();if(pList=NULL)printf(create list error!n);exit(0);print

40、List(pList);printf(the last elem:%dn,getLastElem(pList);6.6.6.6.快速排序快速排序快速排序快速排序#include usingnamespacestd;intPartition(int*L,intlow,int high)inttemp=Llow;intpt=Llow;while(low high)while(low=pt)-high;Llow=Lhigh;while(low high&Llow=pt)+low;Llow=temp;Llow=temp;returnlow;voidQSort(int*L,intlow,int high

41、)if(low high)intpl=Partition(L,low,high);QSort(L,low,pl-1);QSort(L,pl+1,high);Int main()25 intnarry100,addr100;intsum=1,t;cout Input number:t;while(t!=-1)narrysum=t;addrsum-1=t;sum+;cin t;sum-=1;QSort(narry,1,sum);for(int i=1;i=sum;i+)cout narryi t;cout endl;intk;cout Please input place you want:k;i

42、ntaa=1;intkk=0;for(;)if(aa=k)break;if(narrykk!=narrykk+1)aa+=1;kk+;cout The NO.k number is:narrysum-kk endl;cout And its place is:;for(i=0;i sum;i+)if(addri=narrysum-kk)cout i 0.000001&x-0.000001)6)不能做 switch()的参数类型是:switch 的参数不能为实型,还有字符串。7)局部变量能否和全局变量重名?答:能,局部会屏蔽全局。要用全局变量,需要使用:局部变量可以与全局变量同名,在函数内引用这

43、个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的 局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作 用域就在那个循环体内 8)如何引用一个已经定义过的全局变量?答:extern 可以用引用头文件的方式,也可以用 extern 关键字,如果用引用头文件方式来引 用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报 错,如果你用 extern 方式引用时,假定你犯了同样的错误,那么在编译期间不会 报错,而在连接期间报错 27 9)全局变量可不可以定义在可被多个.C 文件包含的头文件中?为什么?答:可

44、以,在不同的 C 文件中以 static 形式来声明同名全局变量。可以在不同的 C 文件中声明同名的全局变量,前提是其中只能有一个 C 文件中对此 变量赋初值,此时连接不会出错 10)语句 for(;1;)有什么问题?它是什么意思?答:和 while(1)相同。永真 11)dowhile 和 whiledo 有什么区别?答:前一个循环一遍再判断,后一个判断以后再循环 12)tatic全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static 函数与普通函数有什么区别?全局变量前面加 static 就构成了静态的全局变量。全局变量本身就是静态存储式,静态全局变

45、量当然也是静态存储方式。两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即 只在定义该变量的源文件内有效。由于静态全局变量的作用域局限于一个源文件内,只 能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。static 全局变 量只初使化一次,防止在其他文件单元中被引用;static 局部变量只被初始化一次,下一次依据上一次结果值;static 函数与普通函数作用域不同。仅在本文件件使用。static 函数在内存中只有一 份,普通函数在每个被调用中维

46、持一份拷贝。13)程序的局部变量存在于 堆栈 中,全局变量存在于 静态区 中,动态申请数据存在于 堆 中。14)设有以下说明和定义:typedef union long i;int k5;char c;DATE;struct data int cat;DATE cow;double dog;too;DATE max;则语句 printf(%d,sizeof(struct date)+sizeof(max);的执行结果是:_ 52 _ 答:DATE 是一个 union,变量公用空间.里面最大的变量类型是 int5,占用 20 个字节.所以它的大小是 20 data 是一个 struct,每个变量

47、分开占用空间.依次为 int4+DATE20+double8=32.所以结果是 20+32=52.当然.在某些 16 位编辑器下,int 可能是 2 字节,那么结果是 int2+DATE10+double8=20 15)以下代码中的输出语句输出 0 吗,为什么?struct CLS 28 int m_i;CLS(int i):m_i(i)CLS()CLS(0);CLS obj;cout obj.m_i)%256 请问 hash(16),hash(256)的值分别是:A.1.16;B.8.32;C.4.16;D.1.32 29 22)一个 32 位的机器,该机器的指针是多少位 指针是多少位只要看

48、地址总线的位数就行了。80386 以后的机子都是 32 的数据总 线。所以指针的位数就是 4 个字节了。23)main()int a5=1,2,3,4,5;int*ptr=(int*)(&a+1);/这个是数组的偏移 printf(%d,%d,*(a+1),*(ptr-1);输出:2,5 *(a+1)就是 a1,*(ptr-1)就是 a4,执行结果是 2,5&a+1 不是首地址+1,系统会认为加一个 a 数组的偏移,是偏移了一个数组的大小 (本 例是 5 个 int)int*ptr=(int*)(&a+1);则 ptr 实际是&(a5),也就是 a+5 原因如下:&a 是数组指针,其类型为 i

49、nt(*)5;而指针加 1 要根据指针类型加上一定的值,不同类型的指针+1 之后增加的大小不同 a 是长度为 5 的 int 数组指针,所以要加 5*sizeof(int)所以 ptr 实际是 a5 但是 prt 与(&a+1)类型是不一样的(这点很重要)所以 prt-1 只会减去 sizeof(int*)a,&a 的地址是一样的,但意思不一样,a 是数组首地址,也就是 a0的地址,&a 是对象(数组)首地址,a+1 是数组下一元素的地址,即 a1,&a+1 是下一个 对象的地址,即 a5.24)写一个“标准”宏,这个宏输入两个参数并返回较小的一个。#define Min(X,Y)(X)(Y)

50、?(Y):(X)/结尾没有;25)嵌入式系统中经常要用到无限循环,你怎么用 C 编写死循环。while(1)或者 for(;)26)关键字 const 有什么含意?表示常量不可以修改的变量。27)关键字 volatile 有什么含意?并举出三个不同的例子?提示编译器对象的值可能在编译器未监测到的情况下改变。28)有以下表达式:int a=248;b=4;int const c=21;const int*d=&a;int*const e=&b;int const*f const=&a;请问下列表达式哪些会被编译器禁止?为什么?30 *c=32;d=&b;*d=43;e=34;e=&a;f=0 x

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com