免费预览已结束,剩余20页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
c、c+笔试题,面试题 笔试,面试,职业规划,考研 笔试,面试,职业规划,考研隐藏 窗体顶端窗体底端2010 C、C+笔试题大全,被问的概率几乎 100%。 、 笔试题大全, 笔试题大全 。很少有真正精通了 C 语言编程的学员,一般都有或多或少概念不是完全清楚的问题, 特别是一些需要丰富的实战经验才能体会和明白的问题,如字符串,指针,类型转换,定义 指向函数的指针类型,这也是导致学习 C 困难的一个原因。下面有几个简单测试将能发现 你对 C 语言的掌握情况。 1)int x=35; char str10; /问:strlen(str)和 sizeof(str)的值分别是多少? 答:strlen(str) 值不确定,strlen 根据0确定字符串是否结束。 sizeof(str)=10 sizeof 一个数组为数组长度 strcpy(str,/*共 13 个字母*/); /问:此时 x 和 strlen(str)的值分别是多少? 答:x 为 35 strcpy(char* dest, const char* src) 根据 src 来复制 dest, 依照 src 的0决定复制的长度, dest 必须要提供足够的长度,这 而 里会引起溢出,strlen 返回 13,但是数组外部的数据已经被破坏 strlen 的值为 13,在 VC+环境下,x 的值是要改变的(其他编译器下没试,).虽然表面上看来, 在程序中并没有修改 x 的值,但是实际运行的结果是上面的 x 的值发生了修改,这是因为 strcpy 以后,把多余的数据拷贝进了 str 的邻居(int 类型的 x)中,所以 x 的数据也就变了.这是一 个曾让我刻骨铭心的问题,在我刚出道时遇到这个问题,虽然在朋友的帮助下解决了这个问题, 但一直不明白 x 的值为何变了,只有最后走上培训教师的岗位,才开始梳理自己曾经的困惑, 才开始总结以前的经验供学员们借鉴.我觉得这个题目的价值非常之大,它能引起学员对字符 串拷贝越界问题的足够重视,并且通过这个问题更能明白字符串的处理是怎么回时,更能明白 字符串与字符数组的关系:字符串就是一个字符数组,只是把这个字符数组用在处理串的函数 中时,这些函数不考虑数组的长度,只是记住数组的首地址,从首地址开始处理,并在遇到 0 时 结束处理, 3)char str10; str=; / also can use :memcpy(str, ) /编译能通过吗? 答:数组不能赋值,只能初始化。char str10 = ; 而且初始化时编译器会检查数组的长度与初始化串的长度是否匹配 4)char *pstr; strcpy(pstr,); /需要初始化并分配空间 /上句编译能通过吗?运行时有问题吗? 答:可以通过编译,但是 pstr 指向了常量区,运行时最好只做读操作,写操作不保险。 编译可以通过,但是 pstr 没有进行有效的初始化,它指向了一个不确定的内存区,运行时会 出现内存不可写错误! const char *p1; char * const p2; /const 指针必须初始化 /上面两句有什么区别吗? 答:const char* 和 char const* 一样,都是表示指向常量的字符指针。 char * const 表示指向字符的常量指针 p1=(const char *)str; /如果是 p1=str;编译能够通过吗?明白为什么要类型转换?类型转换的本质是什么? 答:可以通过编译。关于常量与非常量指针的关系是这样的: const 指针可以指向 const 或者非 const 区域,不会造成什么问题。 非 const 指针不能指向 const 区域,会引起错误。(呵呵,这个问题,很经典) strcpy(p1,abc);/编译能够通过吗? 答: 不能通过,strcpy( char*, const char*); char* 不能指向 const char* 注意:非 const 指针不能指向 const 区域,会引起错误。 printf(%d,str);/有问题吗? 答:没有问题,输出的是 str 的地址信息 Char *pstr; pstr=3000;/编译能过吗?如果不行,该如何修改以保证编译通过呢? 答:不能通过,char* pstr 表示 pstr 是个字符指针,不能指向 3000 的整形变量。 修改的话,可以这样:pstr = (char*)3000,把 pstr 指向 3000 这个地址; long y=(long)pstr;/可以这样做吗? 答:可以,y 的值为 pstr 所指的地址。不过如果是纯粹要地址的话,最好是用 unsigned long。 int *p=str; *p=0x00313200; printf(%s,str);/会是什么效果?提示 0x31 对应字符1,0x32 对应字符2。 答: 首先编译未必会过关,有些编译器可能不允许 int * 直接指向 char*。最好是改为 int *p = (int*)str; 过关了效果就是什么东西都没有。int *p=str; p 为 str 所指的地址,*p 表示修改了 str 所指向 的内存。 由于 sizeof(int)在 32 位机上, 有 4 个字节 int (其实具体要看编译器的配置文件, 好像是 limit.h, 一般是 4 个字节)所以修改了 str0-str3 由于 0x00313200 头尾都是 0, 所以字符串为0开头, 什么都打印不出来。 这里有个 Big-endin 和 little-endin 的问题。以 0x31323334 为例 little-endin 的机器上面, 0x31323334 在内存中排列顺序为 34 33 32 31, 输出为 4321, INTEL 如 芯片的 pc big-endin 机器上面为 31 32 33 34 ,输出为 1234,如 IBM POWERPC p=3000;/p+1 的结果会是多少? 答:3000+sizeof(int); 指针+1 均为原来地址加上 sizeof(指针所指的数据类型) char *pc=new char100;/上述语句在内存中占据几个内存块,怎样的布局情况? 答: 本身 pc 会占用函数栈一个 4 字节的指针长度 (具体是否为 4 个字节要看机器和编译器) 。 new 会在堆上申请 100 个字节 sizeof(char)的连续空间。 void test(char *p) *p=new char100; /这个编译函数有问题吗?外面要调用这个函数,该怎样传递参数? 答:该程序没有问题。需要在函数中对指针所指的地址进行变化是必须传入指针的地址。 原因是这样的:如果传入的为指针本身,在函数调用的时候,实参会被复制一个实例,这 样就不是原来的指针了,对该指针本身进行的任何改变都不能传递回去了。 可以这样理解,如果传入的参数为 int,那么对 int 本身的值的改变就传不回去啦,加个* 也是一样的。 /能明白 typedef int (*PFUN)(int x,int y)及其作用吗? 答:定义了一个函数指针类型的宏,这样 PFUN 就表示指向返回值为 int,且同时带 2 个 int 参数的函数指针类型了。 可以用来定义这样的变量: 比如有个函数为 int fun( int x, int y ); PFUN p = fun; 补充::函数指针最大的用处在于它可以被一个模板方法调用,这是我在学 java 的设计模式时 领悟到的.例如,有两个函数的流程结构完全一致,只是内部调用的具体函数不同,如下所示: void func1() /一段流程代码和面向方面的代理,如安全检查,日志记录等 int sum = add( x , y); /一段流程代码和面向方面的代理,如安全检查,日志记录等 void func2() /与 func1 完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等 int difference = sub( x , y); /与 func1 完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等 那么,可以只定义一个函数,如下所示 void func(PFUNC p) /与 func1 完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等 int difference = p( x , y); /与 func1 完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等 调用程序在调用时,让参数 p 分别指向 add 和 sub 函数就可以了. 以下是腾讯的笔试面试题: 请定义一个宏,比较两个数 a、b 的大小,不能使用大于、小于、if 语句 2、如何输出源文件的标题和目前执行行的行数 3、两个数相乘,小数点后位数没有限制,请写一个高精度算法 4、写一个病毒 5、有 A、B、C、D 四个人,要在夜里过一座桥。他们通过这座桥分别需要耗时 1、2、5、10 分钟,只有一支手电,并且同时最多只能两个人一起过桥。请问, 如何安排,能够在 17 分钟内这四个人都过桥? 2008 年腾讯招聘 选择题(60) c/c+ os linux 方面的基础知识 c 的 Sizeof 函数有好几个! 程序填空(40) 1.(20) 4 空 x5 不使用额外空间,将 A,B 两链表的元素交叉归并 2.(20) 4 空 x5 MFC 将树序列化 转存在数组或 链表中! 1, 计算 ab 2 (运算符优先级问题) 2 根据先序中序求后序 3 a34哪个不能表示 a11: *(&a00) *(*(a+1)+1) *(&a1+1) *(&a00+4) 4 for(int i.) for(int j.) printf(i,j); printf(j) 会出现什么问题 5 for(i=0;i -123 main() . if( *string = - ) n = _1_; else n = num(string); . int num(char* string) for(;!(*string=0);string+) int k; k = _2_; j = -sLen; while( _3_) k = k * 10; num = num + k; return num; 附加题: 1 linux 下调试 core 的命令,察看堆栈状态命令 2 写出 socks 套接字 服务端 客户端 通讯程序 3 填空补全程序,按照我的理解是添入:win32 调入 dll 的函数名 查找函数入口的函数名 找到函数的调用形式 把 formView 加到 singledoc 的声明 将 singledoc 加到 app 的声明 4 1 2 3 有关系 s(sno,sname) c(cno,cname) sc(sno,cno,grade) 问上课程 db的学生 no 成绩最高的学生号 每科大于 90 分的人数 主要是 c/c+、数据结构、操作系统等方面的基础知识。好像有 sizeof、树等选 择题。填空题是补充完整程序。附加题有写算法的、编程的、数据库 sql 语句查 询的。还有一张开放性问题。 请定义一个宏,比较两个数 a、b 的大小,不能使用大于、小于、if 语句 #define Max(a,b) ( a/b)?a:b 如何输出源文件的标题和目前执行行的行数 int line = _LINE_; char *file = _FILE_; coutfile name is (file),line is lineendl; 两个数相乘,小数点后位数没有限制,请写一个高精度算法 写一个病毒 while (1) int *p = new int10000000; 不使用额外空间,将 A,B 两链表的元素交叉归并 将树序列化 转存在数组或 链表中 struct st int i; short s; char c; ; sizeof(struct st); 8 char * p1; void * p2; int p3; char p410; sizeof(p1.p4) =? 4,4,4,10 二分查找 快速排序 双向链表的删除结点 给一个奇数阶 N 幻方,填入数字 1,2,3.N*N,使得横竖斜方向上的和都相同 答案: #include #include #include using namespace std; int main() int n; cinn; int i; int *Matr=new int*n;/动态分配二维数组 for(i=0;in;+i) Matr i =new intn;/动态分配二维数组 /j=n/2 代表首行中间数作为起点,即 1 所在位置 int j=n/2,num=1;/初始值 i=0; while(num!=n*n+1) /往右上角延升,若超出则用%转移到左下角 Matr(i%n+n)%n(j%n+n)%n=num; /斜行的长度和 n 是相等的,超出则转至下一斜行 if(num%n=0) i+; else i-; j+; num+; for(i=0;in;i+) for(j=0;jn;+j) coutsetw(int)log10(n*n)+4)Matr i j ;/格式控制 coutendlendl;/格式控制 for(i=0;in;+i) delete Matr i ; return 1; 腾讯的一道面试题:(与百度相似,可惜昨天百度死在这方面了)/ 在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只 写出思路即可。 答案: 1,把整数分成 256M 段, 每段可以用 64 位整数保存该段数据个数, 256M*8 = 2G 内存,先清 0 2,读 10G 整数,把整数映射到 256M 段中,增加相应段的记数 3,扫描 256M 段的记数,找到中位数的段和中位数的段前面所有段的记数, 可以把其他段的内存释放 4,因中位数段的可能整数取值已经比较小(如果是 32bit 整数,当然如果是 64bit 整数的话,可以再次分段),对每个整数做一个记数,再读一次 10G 整 数,只读取中位数段对应的整数,并设置记数。 5,对新的记数扫描一次,即可找到中位数。 如果是 32bit 整数,读 10G 整数 2 次,扫描 256M 记数一次,后一次记数因 数量很小,可以忽略不记 (设是 32bit 整数,按无符号整数处理 整数分成 256M 段? 整数范围是 0 - 232 - 1 一共有 4G 种取值, 4G/256M = 16,每 16 个数算一段 0-15 是 1 段,16-31 是一段,. 整数映射到 256M 段中? 如果整数是 0-15,则增加第一段记数,如果整 数是 16-31,则增加第二段记数,. 其实可以不用分 256M 段,可以分的段数少一写,这样在扫描记数段时 会快一些,还能节省一些内存) 腾讯题二: 一个文件中有 40 亿个整数,每个整数为四个字节,内存为 1GB,写出一个 算法:求出这个文件里的整数里不包含的一个整数 答: 方法一: 4 个字节表示的整数,总共只有 232 约等于 4G 个可能。 为了简单起见,可以假设都是无符号整数。 分配 500MB 内存,每一 bit 代表一个整数,刚好可以表示完 4 个字节的 整数,初始值为 0。基本思想每读入一个数,就把它对应的 bit 位置为, 处理完 40G 个数后,对 500M 的内存遍历,找出一个 bit 为 0 的位,输出 对应的整数就是未出现的。 算法流程: )分配内存 buf,初始化为 )unsigned int x=0x1; for each int j in file buf=buf x j; end (3) for(unsigned int i=0; i = 0xffffffff; i+) if (!(buf & x i) output(i); break; 以上只是针对无符号的,有符号的整数可以依此类推。 方法二: 文件可以分段读啊,这个是 O(2n)算法,应该是很快的了,而且空间也允 许的。 不过还可以构造更快的方法的,更快的方法主要是针对定位输出的整数 优化算法。 思路大概是这样的,把值空间等分成若干个值段,比如值为无符号数, 则 00000000H-00000FFFH 00001000H-00001FFFH . 0000F000H-0000FFFFH . FFFFF000H-FFFFFFFFH 这样可以订立一个规则,在一个值段范围内的数第一次出现时,对应值 段指示值 Xn=Xn+1,如果该值段的所有整数都出现过,则 Xn=1000H, 这样后面输出定位时就可以直接跳过这个值段了,因为题目仅仅要求输 出一个,这样可以大大减少后面对标志数值的遍历步骤。 理论上值段的划分有一定的算法可以快速的实现,比如利用位运算直接 定位值段对应值进行计算。 腾讯面试题: 有 1 到 10w 这 10w 个数,去除 2 个并打乱次序,如何找出那两个数。(不 准用位图!) 位图解决: 位图的方法如下 假设待处理数组为 A10w-2 定义一个数组 B10w,这里假设 B 中每个元素占用 1 比特,并初始化为全 0 for(i=0;i 10w-2;i+) B Ai =1 那么 B 中不为零的元素即为缺少的数据 这种方法的效率非常高,是计算机中最常用的算法之一 其它方法: 求和以及平方和可以得到结果,不过可能求平方和运算量比较大(用 64 位 int 不会溢出) 腾讯面试题: 腾讯服务器每秒有 2w 个 QQ 号同时上线,找出 5min 内重新登入的 qq 号并 打印出来。 解答: 第二题如果空间足够大,可以定义一个大的数组 aqq 号,初始为零,然后这个 qq 号登陆了就 aqq 号+ 最后统计大于等于 2 的 QQ 号 这个用空间来代替时间 第二个题目,有不成熟的想法。 2w x 300s 所以用 6,000,000 个桶。 删除超时的算法后面说, 所以平均桶的大小是 1 。 假设 qq 号码一共有 1010 个,所以每个桶装的 q 号码 是 1010 / (6 * 106) 个,这个是插入时候的最坏效率(插入同一个桶的 时候是顺序查找插入位置的)。 qq 的节点结构和上面大家讨论的基本一样, 增加一个指针指向输出列表, 后面说。 struct QQstruct num_type qqnum; timestamp last_logon_time; QQstruct *pre; QQstruct *next; OutPutList *out; / 用于 free 节点的时候,顺便更新一下输出列表。 另外增加两个指针列表。 第一个大小 300 的循环链表, 自带一个指向 QQStruct 的域, 循环存 300 秒 内的 qq 指针。时间一过 就 free 掉, 所以保证所有桶占用的空间在 2w X 300 以内。 第二个是 输出列表, 就是存放题目需要输出的节点。 如果登陆的用户,5 分钟内完全没有重复的话,每秒 free 掉 2w 个节点。 不过在 free 的时候,要判断一下时间是不是真的超时,因为把节点入桶 的时候,遇到重复的,会更 新一下最后登陆的时间。当然啦,这个时候,要把这个 qq 号码放到需要 输出的列表里面 1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用: 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局 部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义 多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个 局部变量的作用域就在那个循环体内。 2、如何引用一个已经定义过的全局变量? 答:extern 可以用引用头文件的方式,也可以用 extern 关键字,如果用引用头文件方式 来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期 间会报错,如果你用 extern 方式引用时,假定你犯了同样的错误,那么在编译期 间不会报错,而在连接期间报错。 3、全局变量可不可以定义在可被多个.C 文件包含的头文件中?为什么? 答:可以,在不同的 C 文件中以 static 形式来声明同名全局变量。 可以在不同的 C 文件中声明同名的全局变量,前提是其中只能有一个 C 文 件中对此变量赋初值,此时连接不会出错 4、语句 for( ;1 ;)有什么问题?它是什么意思? 答:和 while(1)相同。 5、dowhile 和 whiledo 有什么区别? 答:前一个循环一遍再判断,后一个判断以后再循环 6、请写出下列代码的输出内容 #include main() int a,b,c,d; a=10; b=a+; c=+a; d=10*a+; printf(b,c,d:%d,%d,%d,b,c,d); return 0; 答:10,12,120 7、static 全局变量与普通的全局变量有什么区别?static 局部变量和普通局 部变量有什么区别?static 函数与普通函数有什么区别? 全局变量(外部变量)的说明之前再冠以 static 就构成了静态的全局变量。全 局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者 在存储方式上并无不同。 这两者的区别虽在于非静态全局变量的作用域是整个源 程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中 都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件 内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用 域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它 源文件中引起错误。 从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方 式即改变了它的生存期。 把全局变量改变为静态变量后是改变了它的作用域, 限 制了它的使用范围。 static 函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的 函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对 于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数 的源文件要包含这个头文件 static 全局变量与普通的全局变量有什么区别: static 全局变量只初使化一次, 防止在其他文件单元中被引用; static 局部变量和普通局部变量有什么区别: static 局部变量只被初始化一次, 下一次依据上一次结果值; static 函数与普通函数有什么区别:static 函数在内存中只有一份,普通函数 在每个被调用中维持一份拷贝 8、程序的局部变量存在于(栈)中,全局变量存在于(静态区 )中,动态 申请数据存在于( 堆)中。 9、设有以下说明和定义: 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, 每个变量分开占用空间. 依次为 int4 + DATE20 + double8 = 32. 所以结果是 20 + 32 = 52. 当然.在某些 16 位编辑器下, int 可能是 2 字节,那么结果是 int2 + DATE10 + double8 = 20 10、队列和栈有什么区别? 队列先进先出,栈后进先出 11、写出下列代码的输出内容 #include int inc(int a) return(+a); int multi(int*a,int*b,int*c) return(*c=*a*b); typedef int(FUNC1)(int in); typedef int(FUNC2) (int*,int*,int*); void show(FUNC2 fun,int arg1, int*arg2) INCp=&inc; int temp =p(arg1); fun(&temp,&arg1, arg2); printf(%dn,*arg2); main() int a; show(multi,10,&a); return 0; 答:110 12、请找出下面代码中的所以错误 说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba” 1、#includestring.h 2、main() 3、 4、 char*src=hello,world; 5、 char* dest=NULL; 6、 int len=strlen(src); 7、 dest=(char*)malloc(len); 8、 char* d=dest; 9、 char* s=srclen; 10、 while(len-!=0) 11、 d+=s-; 12、 printf(%s,dest); 13、 return 0; 14、 答: 方法 1: int main() char* src = hello,world; int len = strlen(src); char* dest = (char*)malloc(len+1);/要为0 分配一个空间 char* d = dest; char* s = &srclen-1;/指向最后一个字符 while( len- != 0 ) *d+=*s-; *d = 0;/尾部要加0 printf(%sn,dest); free(dest);/ 使用完,应当释放空间,以免造成内存汇泄露 return 0; 方法 2: #include #include main() char str=hello,world; int len=strlen(str); char t; for(int i=0; ilen/2; i+) t=stri; stri=strlen-i-1; strlen-i-1=t; printf(%s,str); return 0; 1.-1,2,7,28,126 请问 28 和 126 中间那个数是什么?为什么? 第一题的答案应该是 43-1=63 规律是 n3-1(当 n 为偶数 0,2,4)n3+1(当 n 为奇数 1,3,5) 答案:63 2.用两个栈实现一个队列的功能?要求给出算法和思路! 设 2 个栈为 A,B, 一开始均为空. 入队: 将新元素 push 入栈 A; 出队: (1)判断栈 B 是否为空; (2)如果不为空,则将栈 A 中所有元素依次 pop 出并 push 到栈 B; (3)将栈 B 的栈顶元素 pop 出; 这样实现的队列入队和出队的平摊复杂度都还是 O(1), 比上面的几种方法要 好。 3.在 c 语言库函数中将一个字符转换成整型的函数是 atool()吗,这个函数的原型 是什么? 函数名: atol 功 能: 把字符串转换成长整型数 用 法: long atol(const char *nptr); 程序例: #include #include int main(void) long l; char *str = 98765432; l = atol(lstr); printf(string = %s integer = %ldn, str, l); return(0); 13.对于一个频繁使用的短小函数,在 C 语言中应用什么实现,在 C+中应用什 么实现? c 用宏定义,c+用 inline 17.软件测试都有那些种类? 黑盒:针对系统功能的测试 白合:测试函数功能,各函数接口 18.确定模块的功能和模块的接口是在软件设计的那个队段完成的? 概要设计阶段 19. enum string x1, x2, x3=10, x4, x5, x; 问 x= 0x801005,0x8010f4 ; 20. unsigned char *p1; unsigned long *p2; p1=(unsigned char *)0x801000; p2=(unsigned long *)0x810000; 请问 p1+5= ; p2+5= ; 25.请问下面程序有什么错误? int a602501000,i,j,k; for(k=0;k=1000;k+) for(j=0;j250;j+) for(i=0;i60;i+) aijk=0; 把循环语句内外换一下 26. #define Max_CB 500 void LmiQueryCSmd(Struct MSgCB * pmsg) unsigned char ucCmdNum; . for(ucCmdNum=0;ucCmdNumMax_GT_Length) return GT_Length_ERROR; . C 语言面试题大汇总之华为面试题 Eddy 整理 1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用: ;局部变量可以与全局变量同名,在函数内引用 这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以 定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就 在那个循环体内。 2、如何引用一个已经定义过的全局变量? 答:extern 可以用引用头文件的方式,也可以用 extern 关键字,如果用引用头文件方式来引用某个在 头文件中声明的全局变理,假定你将那个编写错了,那么在编译期间会报错,如果你用 extern 方式引用 时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。 3、全局变量可不可以定义在可被多个.C 文件包含的头文件中?为什么? 答:可以,在不同的 C 文件中以 static 形式来声明同名全局变量。 4、请写出下列代码的输出内容 #include int main(void) int a,b,c,d; a=10; b=a+; c=+a; d=10*a+; printf(b,c,d:%d,%d,%d,b,c,d); return 0; 答:10,12,120 5、 static 全局变量与普通的全局变量有什么区别?static 局部变量和普通局部变量有什么区别?static 函 数与普通函数有什么区别? 答: 1) 全局变量(外部变量)的说明之前再冠以 static 就构成了静态的全局变量。全局变量本身就是静态 存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别在于非 静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文 件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程 序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函 数公用, 因此可以避免在其它源文件中引起错误。 2) 从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。 把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。 3) static 函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内 可以在不同的 C 文件中声明同名 的全局变量,前提是其中只能有一个 C 文件中对此变量赋初值,此时连接不会出错. 部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明, 要使用这些函数的源文件要包含这个头文件 综上所述: static 全局变量与普通的全局变量有什么区别: static 全局变量只初使化一次,防止在其他文件单元中被引用; static 局部变量和普通局部变量有什么区别: static 局部变量只被初始化一次,下一次依据上一次结果值; static 函数与普通函数有什么区别: static 函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝 6、程序的局部变量存在于(栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。 7、设有以下说明和定义: typedef union long i; int k5; char c; DATE; struct data int cat; DATE cow; double dog; too; DATE max; 则语句 printf(%d,sizeof(struct data)+sizeof(max);的执行结果是:_52_ 考点:区别 struct 与 union.(一般假定在 32 位机器上) 答:DATE 是一个 union, 变量公用空间. 里面最大的变量类型是 int5, 占用 20 个字节. 所以它的大小 是 20. data 是一个 struct, 每个变量分开占用空间. 依次为 int4 + DATE20 + double8 = 32. 所以结 果是 20 + 32 = 52. 当然.在某些 16 位编辑器下, int 可能是 2 字节,那么结果是 int2 + DATE10 + double8 = 20 8、队列和栈有什么区别? 队列先进先出,栈后进先出 9、写出下列代码的输出内容 #include int inc(int a) return(+a); int multi(int*a,int*b,int*c) return(*c=*a*b); typedef int(FUNC1)(int in); typedef int(FUNC2) (int*,int*,int*); void show(FUNC2 fun,int arg1, int*arg2) FUNC1 p=&inc; int temp =p(arg1); fun(&temp,&arg1, arg2); printf(%dn,*arg2); main() int a; /局部变量 a 为 0; show(multi,10,&a); return 0; 答:110 10、请找出下面代码中的所有错误 (题目不错,值得一看) 说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba” #includestring.h main() char*src=hello,world; char* dest=NULL; int len=strlen(src); dest=(char*)malloc(len); char* d=dest; char* s=srclen; while(len-!=0) d+=s-; printf(%s,dest); return 0; 答: 方法 1:一共有 4 个错误; int main() char* src = hello,world; int len = strlen(src); char* dest = (char*)malloc(len+1);/要为分配一个空间 char* s = &srclen-1; while( len- != 0 ) *d+=*s-; *d = 0; free(dest); dest = NULL; return 0; /尾部要加0 / 使用完,应当释放空间,以免造成内存汇泄露 /防止产生野指针 printf(%sn,dest); /指向最后一个字符 char* d = dest; 方法 2: (方法一需要额外的存储空间,效率不高.) 不错的想法 #include #include main() char str=hello,world; int len=strlen(str); char t; for(int i=0; ilen/2; i+) t=stri; stri=strlen-i-1; /小心一点 strlen-i-1=t; printf(%s,str); return 0; 11.对于一个频繁使用的短小函数,在 C 语言中应用什么实现,在 C+中应用什么实现? c 用宏定义,c+用 inline 12.直接链接两个信令点的一组链路称作什么? PPP 点到点连接 13.接入网用的是什么接口? V5 接口 14.voip 都用了那些协议? H.323 协议簇、SIP 协议、Skype 协议、H.248 和 MGCP 协议 15.软件测试都有那些种类? 黑盒:针对系统功能的测试 白盒:测试函数功能,各函数接口 16.确定模块的功能和模块的接口是在软件设计的那个队段完成的? 概要设计阶段 17. unsigned char *p1; unsigned long *p2; p1=(unsigned char *)0x801000; p2=(unsigned long *)0x810000; 请问 p1+5= ; p2+5= ; 答案:0x801005(相当于加上 5 位) 0x810014(相当于加上 20 位); 选择题: 21.Ethternet 链接到 Internet 用到以下那个协议? D A.HDLC;B.ARP;C.UDP;D.TCP;E.ID 22.属于网络层协议的是:( B C) A.TCP;B.IP;C.ICMP;D.X.25 23.Windows 消息调度机制是:(C) A.指令队列;B.指令堆栈;C.消息队列;D.消息堆栈; 找错题: 25.请问下面程序有什么错误? int a602501000,i,j,k; for(k=0;kMax_GT_Length) 问答题: 29.IP Phone 的原理是什么? IP 电话(又称 IP PHONE 或 VoIP)是建立在 IP 技术上的分组化、数字化传输技术,其基本原理是: 通过语音压缩算法对语音数据进行压缩编码处理,然后把这些语音数据按 IP 等相关协议进行打包,经过 IP 网络把数据包传输到接收地,再把这些语音数据包串起来,经过解码解压处理后,恢复成原来的语音信号,从 而达到由 IP 网络传送语音的目的。 30.TCP/IP 通信建立的过程怎样,端口有什么作用? 三次握手,确定是哪个应用程序使用该协议 31.1 号信令和 7 号信令有什么区别,我国某前广泛使用的是那一种? 1 号信令接续慢,但是稳定,可靠。 7 号信令的特点是:信令速度快,具有提供大量信令的潜力,具有改变和增加信令的灵活性,便于开放 新业务,在通话时可以随意处理信令,成本低。目
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 英国文化特点介绍
- 塑料科学教学设计
- 重工业物流介绍
- 风湿热病常见症状及护理技巧培训
- 氧气丙烷安全教育
- 我的幼师教育故事
- 捏泥人艺术介绍
- 网络情人节介绍
- 部门研发成果介绍
- 生产流程管理员工手册
- 输血科培训及管理制度
- 成人高等学历教育英语教育专业课程教学大纲
- 《房屋市政工程生产安全重大事故隐患判定标准(2024版)》知识培训
- 2026年日历表全年表(含农历、周数、节假日及调休-A4纸可直接打印)-
- SZDB∕Z 317-2018 大中型商场、超市安全防范规范
- 小学生芯片知识普及
- 《无人机搭载红外热像设备检测建筑外墙及屋面作业》
- 2024年部编版三年级语文(上)册期中测试试卷 5套
- 2024年12月管理体系认证基础考试真题及答案
- 《红楼梦》贾宝玉介绍
- 蓝色国潮风回族介绍模板
评论
0/150
提交评论