【计算机类职业资格】程序员面试-2及答案解析.doc
《【计算机类职业资格】程序员面试-2及答案解析.doc》由会员分享,可在线阅读,更多相关《【计算机类职业资格】程序员面试-2及答案解析.doc(20页珍藏版)》请在麦多课文档分享上搜索。
1、程序员面试-2 及答案解析(总分:100.00,做题时间:90 分钟)一、论述题(总题数:28,分数:100.00)1.strlen(“/0“)=?sizeof(“/0“)=? (分数:3.00)_2.对于结构体而言,为什么 sizeof 返回的值一般大于期望值 (分数:3.00)_3.指针进行强制类型转换后与地址进行加法运算,结果是什么 (分数:3.00)_4.使用指针有哪些好处 (分数:3.00)_5.引用还是指针 (分数:3.00)_6.指针和数组是否表示同一概念 (分数:3.00)_7.指针是否可进行、=、=、=运算 (分数:3.00)_8.指针与数字相加的结果是什么 (分数:3.00
2、)_9.野指针?空指针 (分数:3.00)_10.C/C+头文件中的 ifndef/define/endif 的作用有哪些 (分数:3.00)_11.#includefilename.h和#include“filename.h“有什么区别 (分数:3.00)_12.#define 有哪些缺陷 (分数:3.00)_13.如何使用 define 声明一个常数,用以表明 1 年中有多少秒(忽略闰年问题) (分数:4.00)_14.含参数的宏与函数有什么区别 (分数:4.00)_15.宏定义平方运算#define SQR(X)X*X 是否正确执行平方运算的宏定义不正确,会造成错误。下面以如下程序代码为
3、例进行分析。 (分数:4.00)_16.不能使用大于、小于、if 语句,如何定义一个宏来比较两个数 a、b 的大小 (分数:4.00)_17.如何判断一个变量是有符号数还是无符号数 (分数:4.00)_18.#define TRACE(S)(printf(“%s/n“,#s),s)是什么意思 (分数:4.00)_19.不使用 sizeof,如何求 int 占用的字节数 (分数:4.00)_20.如何使用宏求结构体的内存偏移地址 (分数:4.00)_21.如何用 sizeof 判断数组中有多少个元素 (分数:4.00)_22.枚举和 define 有什么不同 (分数:4.00)_23.typde
4、f 和 define 有什么区别 (分数:4.00)_24.C+中宏定义与内联函数有什么区别 (分数:4.00)_25.定义常量谁更好?#define 还是 const (分数:4.00)_26.C 语言中 struct 与 union 的区别是什么 (分数:4.00)_27.C 和 C+中 struct 的区别是什么 (分数:4.00)_28.C+中 struct 与 class 的区别是什么 (分数:4.00)_程序员面试-2 答案解析(总分:100.00,做题时间:90 分钟)一、论述题(总题数:28,分数:100.00)1.strlen(“/0“)=?sizeof(“/0“)=? (分
5、数:3.00)_正确答案:()解析:strlen(“/0“)=0,sizeof(“/0“)=2。 strlen 执行的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符“/0“为止,然后返回计数器值。 sizeof 是 C 语言的关键字,它以字节的形式给出了其操作数的存储大小,操作数可以是一个表达式或括在括号内的类型名,操作数的存储大小由操作数的类型决定。 具体而言,strlen 与 sizeof 的差别表现在以下几个方面: 1)sizeof 是关键字,而 strlen 是函数。sizeof 后如果是类型必须
6、加括弧,如果是变量名可以不加括弧。 2)sizeof 操作符的结果类型是 size_t,它在头文件中 typedef 为 unsigned int 类型。该类型保证能够容纳实现所建立的最大对象的字节大小。 3)sizeof 可以用类型作为参数,strlen 只能用 char*做参数,而且必须是以“/0“结尾的。sizeof 还可以以函数作为参数,如 int g(),则 sizeofig()的值等于 sizeof(int)的值,在 32 位计算机下,该值为4。 4)当数组名做 sizeof 的参数时不退化,传递给 strlen 就退化为指针了。以数组 char a10为例,在 32位机器下,si
7、zeof(a)=1*10=10,而传递给 strlen 就不一样了。 5)大部分编译程序的 sizeof 都是在编译的时候计算的,所以可以通过 sizeof(x)来定义数组维数。而strlen 的计算则是在运行期计算的,用来计算字符串的实际长度,不是类型占内存的大小。例如,char str20=“0123456789“,字符数组 str 是编译期大小已经固定的数组,在 32 位机器下,为 1*20=20,而其 strlen 大小则是在运行期确定的,所以其值为字符串的实际长度 10。 6)当用于计算一个结构类型或变量的 sizeof 时,返回实际的大小,当用于计算一个静态变量或数组时,返回整个数
8、组所占用的大小,而 sizeof 不能返回动态数组大小。 7)数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址。例如: fun(char8) fun(char) 都等价于 fun(char*)。在 C+里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小,如果想在函数内知道数组的大小,需要这样做:进入函数后用 memcpy 复制出来,长度由另一个形参传进去。 fun(unsiged char*p1,int len) unsigned char* buf=new unsigned charlen+1; memcpy(buf,p1,len); 程序示例 1: #i
9、ncludestdio.h #includestring.h int main() char arr10=“Hello“; printf(“%d/n“,strlen(arr); printf(“%d/n“,sizeof(arr); return 0; 程序输出结果: 5 10 sizeof 返回定义的 arr 数组时,编译器为其分配的数组空间大小不关心里面存了多少数据。strlen 只关心存储的数据内容,不关心空间的大小和类型。 程序示例 2: #includestdio.h #includestring.h int main() char* parr=new char10; printf(“
10、%d/n“,strlen(parr); printf(“%d/n“,sizeof(parr); printf(“%d/n“,sizeof(*parr); return 0; 程序输出结果: 14 4 1 在上例中,程序定义了一个字符指针 parr,它指向一个分配了 10 个空间的字符数组,由于没有进行初始化,根据 strlen 的计算原理,所以不能够确定 sterlen(parr)的值,因为无法确定字符串的终止位置,所以该值为一个随机值,本例中输出为 14。在 32 位机器下,parr 为一个指针,所以 sizeof(parr)的值为 4,parr 为指向字符的指针,所以 sizeof(*pa
11、rr)的值为 1。2.对于结构体而言,为什么 sizeof 返回的值一般大于期望值 (分数:3.00)_正确答案:()解析:struct 是一种复合数据类型,其构成元素既可以是基本数据类型,如int、double、float、short、char 等,也可以是复合数据类型,如数组、struct、union 等数据单元。 一般而言,struct 的 sizeof 是所有成员对齐后长度相加,而 union 的 sizeof 是取最大的成员长度。 在结构中,编译器为结构的每个成员按其自然边界(alignment)分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址
12、相同。 字节对齐也称为字节填充,它是 C+编译器的一种技术手段,主要是为了在空间与复杂度上达到平衡。简单地讲,是为了在可接受的空间浪费的前提下,尽可能地提高对相同运算过程的最少(快)处理。字节对齐的作用不仅是便于 CPU 的快速访问,使 CPU 的性能达到最佳,而且可以有效地节省存储空间。例如,32位的计算机的数据传输值是 4 字节,64 位计算机数据传输是 8 字节,这样 struct 在默认的情况上,编译器会对 struct 的结构进行(32 位机)4 的倍数或(64 位机)8 的倍数的数据对齐。对于 32 位机来说,4 字节对齐能够使 CPU 访问速度提高,比如说一个 long 类型的变
13、量,如果跨越了 4 字节边界存储,那么 CPU 要读取两次,这样效率就低了,但需要注意的是,如果在 32 位机中使用 1 字节或者 2 字节对齐,不仅不会提高效率,反而会使变量访问速度降低。 在默认情况下,编译器为每一个变量或数据单元按其自然对界条件分配空间。一般地,可以通过下面的方法来改变默认的对界条件: 1)使用伪指令#pragma pack(n),C 编译器将按照 n 个字节对齐。 2)使用伪指令#pragma pack(),取消自定义字节对齐方式。 3)另外,还有如下的一种方式:_attribute(aligned(n),让所作用的结构成员对齐在 n 字节自然边界上。如果结构中有成员的
14、长度大于 n,则按照最大成员的长度来对齐。_attribute_(packed),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。 例如如下数据结构: struct test charx1; short x2; float x3; char x4; ; 由于编译器默认情况下会对 struct 作边界对齐,结构的第一个成员 x1,其偏移地址为 0,占据了第 1 个字节,第二个成员 x2 为 short 类型,其起始地址必须 2 字节对齐,因此编译器在 x2 和 x1 之间填充了一个空字节。结构的第三个成员 x3 和第四个成员 x4 恰好落在其自然边界地址上,在它们前面不需要额外的填充
15、字节。在 test 结构中,成员 x3 要求 4 字节对界,是该结构所有成员中要求的最大边界单元,因而test 结构的自然对界条件为 4 字节,编译器在成员 x4 后面填充了 3 个空字节。整个结构所占据空间为 12字节。 再例如如下数据结构: struct s1 short d; int a; short b; a1; 在 32 位机器下,short 型占两个字节,int 型占 4 个字节,所以为了满足字节对齐,变量 d 除了自身所占用的两个字节外,还需要再填充两个字节,变量 a 占用 4 个字节,变量 b 除了自身占用的两个字节,还需要两个填充字节,所以最终 s1 的 sizeof 为 1
16、2。 字节对齐的细节和编译器实现相关,但一般而言,满足以下 3 个准则: 1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除。 2)结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍。如有需要,编译器会在成员之间加上填充字节。 3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。 需要注意的是,基本类型是指前面提到的像 char、short、int、float、double 这样的内置数据类型,这里所说的“数据宽度”就是指其 sizeof 的大小,在 32 位机器上,这些基本数据类型的 sizeof 大小分别
17、为 1、2、4、4、8。由于结构体的成员可以是复合类型,所以在寻找最宽基本类型成员时,应当包括复合类型成员的子成员,而不是把复合成员看成是一个整体。如果一个结构体中包含另外一个结构体成员,那么此时最宽基本类型成员不是该结构体成员,而是取基本类型的最宽值。但在确定复合类型成员的偏移位置时,则是将复合类型作为整体看待,即复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度,达到程序优化的目的。3.指针进行强制类型转换后与地址进行加法运算,结果是什么 (分数:3.00)_正确答案:()解析:假设在 32 位机器上,在对齐为 4 的情况下,sizeof(lo
18、ng)的结果为 4 字节,sizeof(char*)的结果为 4 字节,sizeof(short int)的结果与 sizeoflshort)的结果都为 2 字节,sizeof(char)的结果为 1 字节,sizeof(int)的结果为 4 字节,由于 32 位机器上是 4 字节对齐,以如下结构体为例: struct BBB long num; char *name; short int data; char ha; short ba5; *p; 当 p=0x1000000;则 p+0x200=?(Ulong)p+0x200=?(char*)p+0x200=? 其实,在 32 位机器下,si
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
5000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 职业资格 程序员 面试 答案 解析 DOC
