C笔试面试题及答案解析(一).pdf_第1页
C笔试面试题及答案解析(一).pdf_第2页
C笔试面试题及答案解析(一).pdf_第3页
C笔试面试题及答案解析(一).pdf_第4页
C笔试面试题及答案解析(一).pdf_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 错题 1 1 基础 1 下列选项中 合法的 C 语言关键字是 D A VAR B cher C integer D default default 只用在 switch 语句中 2 若执行完成下列语句 int a 3 b 6 c c a b 2 则变量 c 的二进制值为 D A 00011100 B 00010100 C 0001000 D 00011011 3 设有以下定义或语句 则输出的结果是 A 用 small 模式编译 指针变量占 2 个字节 struct date long cat struct date next double dog too printf d sizeof too A 20 B 16 C 14 D 12 4 设 x y t 均为 int 型变量 则执行语句 x y 3 t x y 后 y 的值 为 C A 不定值 B 4 C 3 D 1 5 执行下列语句中 sum 变量的值是 D int sum 0 for int i 0 i EPSINON char p str i nt n 10 请计算 1 sizeof str 2 s i zeof p 3 sizeof n 标准答案 1 6 2 4 3 4 8 请问以下代码有什么问题 char s AAA printf s s s 0 B printf s s 有什么错 标准答案 AAA 是字符串常量 s 是指针 指向这个字符串常量 所 以声明 s 的时候就有问题 cosnt char s AAA 然后又因为是常量 所以对是 s 0 的赋值操作是不合法的 const char p 123 p 1 3 会报错 p 456 不会报错 const char 只是说指针指向的内容不可变 但指针本身可以再赋值 假设你的程序是 char findArg char s return s 这个时候 你如果传 const char 进去 那么好一些的编译器 会知道 你传 回的函数返回值 也是 const char 也就是指针指向的内容不可写 所以如果你传进去的是 const char 最好还是把 char name 写成 const char name 因为 char name 可以对指针指向的内容进行修改 用强制转换当然也可以 但是 const char name2 123 char name char name2 如果你对 name 指向的内容进行改变 如 name 2 4 123 是常量 对常量进行修改 你的程序就会发生不可预知的错误 char findArg char 如果你这个函数 对传入的参数 不会对指针指向的内容进行修改 最好写 成 char findArg const char 或 const char findArg const char 9 给定结构 struct A char t 4 char k 4 unsigned short i 8 unsigned long m 问 sizeof A 标准答案 8 10 struct name2 char str int num short x 求 sizeof name2 标准答案 12 32 位 64 位 char 1 1 int 4 大多数 4 少数 8 short 2 2 long 4 8 float 4 4 double 8 8 指针 4 8 单位都为字节 结构体 struct 比较复杂 对齐问题 联合 union 所有成员中最长的 枚举 enum 根据数据类型 1 结构体变量中成员的偏移量必须是成员大小的整数倍 0 被认 为是任何数的整数倍 2 结构体大小必须是所有成员大小的整数倍 也即所有成员大小 的公倍数 结构体类型需要考虑到字节对齐的情况 不同的顺序会影响结构体的大小 11 关键字 volatile 有什么含意 并给出三个不同的例子 参考答案 一个定义为 volatile 的变量是说这变量可能会被意想不到地改 变 这样 编译器就不会去假设这个变量的值了 精确地说就是 优化器在用到 这个变量时必须每次都小心地重新读取这个变量的值 而不是使用保存在寄存器 里的备份 下面是 volatile 变量的几个例子 1 并行设备的硬件寄存器 如 状态寄存器 2 一个中断服务子程序中会访问到的非自动变量 Non automatic variables 3 多线程应用中被几个任务共享的变量 12 include 和 include filename h 有什么区别 标准答案 对于 include 编译器从标准库路径开始搜 索 filename h 对于 include filename h 编译器从用户的工作路径开始搜 索 filename h 13 const 有什么用途 请至少说明两种 标准答案 1 可以定义 const 常量 单独定义 const 变量没有明显的优势 完全 可以使用 define 命令代替 2 const 可以修饰函数的参数 返回值 甚至函数的定义体 被 const 修 饰的东西都受到强制保护 可以预防意外的变动 能提高程序的健壮性 在 const int p 中 忽略掉 int 被 const 直接修饰的是 p p 最终指向指针 p 指向的地址的内容 所以该内容不可变 至少不可以使用 p 进行修改 而变量 p 没有被 const 直接修饰 所以指正变量 p 最终指向的内容 也就是 p 本身的值 是可变的 这样这一句可以等效于 int const p 这两种声明有没有其他的不同 之处 笔者暂时还不清楚 在 int const p 中 指针变量 p 本 const 直接修饰 所以 p 的内容 地址 是 不可变的 而 p 指向的地址的内容 即 p 没有被 const 直接修饰 所以 p 指向 的地址的内容是可变的 即 p 可以被再赋值 14 static 有什么用途 请至少说明两种 标准答案 1 限制变量的作用域 static 全局变量 2 设置变量的存储域 static 局部变量 一 static 全局变量 当一个进程的全局变量被声明为 static 之后 它的中文名叫静态全局变量 静态全局变量和其他的全局变量的存储地点并没有区别 都是在 data 段 已初 始化 或者 bss 段 未初始化 内 但是它只在定义它的源文件内有效 其他源 文件无法访问它 所以 普通全局变量穿上 static 外衣后 它就变成了新娘 已 心有所属 只能被定义它的源文件 新郎 中的变量或函数访问 二 static 局部变量 普通的局部变量在栈空间上分配 这个局部变量所在的函数被多次调用时 每次调用这个局部变量在栈上的位置都不一定相同 局部变量也可以在堆上动态 分配 但是记得使用完这个堆空间后要释放之 static 局部变量中文名叫静态局 部变量 它与普通的局部变量比起来有如下几个区别 1 位置 静态局部变量被编译器放在全局存储区 data 注意 不在 bss 段 内 原因见 3 所以它虽然是局部的 但是在程序的整个生命周期中存在 2 访问权限 静态局部变量只能被其作用域内的变量或函数访问 也就是 说虽然它会在程序的整个生命周期中存在 由于它是 static 的 它不能被其他的 函数和源文件访问 3 值 静态局部变量如果没有被用户初始化 则会被编译器自动赋值为 0 以后每次调用静态局部变量的时候都用上次调用后的值 这个比较好理解 每次 函数调用静态局部变量的时候都修改它然后离开 下次读的时候从全局存储区读 出的静态局部变量就是上次修改后的值 三 static 函数 相信大家还记得 C 面向对象编程中的 private 函数 私有函数只有该类的 成员变量或成员函数可以访问 在 C 语言中 也有 private 函数 它就是接下 来要说的 static 函数 完成面向对象编程中 private 函数的功能 当你的程序中有很多个源文件的时候 你肯定会让某个源文件只提供一些外 界需要的接口 其他的函数可能是为了实现这些接口而编写 这些其他的函数你 可能并不希望被外界 非本源文件 所看到 这时候就可以用 static 修饰这些 其 他的函数 所以 static 函数的作用域是本源文件 把它想象为面向对象中的 private 函数 就可以了 15 如何引用一个已经定义过的全局变量 标准答案 可以用引用头文件的方式 也可以用 extern 关键字 如果用引用头文件方式来引用某个在头文件中声明的全局变理 假定你将那 个变量写错了 那么在编译期间会报错 如果你用 extern 方式引用时 假定你犯了同样的错误 那么在编译期间不 会报错 而在连接期间报错 16 A c 和 B c 两个 c 文件中使用了两个相同名字的 static 变量 编译的时候 会不会有问题 这两个 static 变量会保存到哪里 栈还是堆或者其他的 标准答案 static 的全局变量 表明这个变量仅在本模块中有意义 不会 影响其他模块 他们都放在静态数据区 但是编译器对他们的命名是不同的 如果要使变量在其他模块也有意义的话 需要使用 extern 关键字 17 用两个栈实现一个队列的功能 要求给出算法和思路 参考答案 设 2 个栈为 A B 一开始均为空 入队 将新元素 push 入栈 A 出队 1 判断栈 B 是否为空 2 如果不为空 则将栈 A 中所有元素依次 pop 出并 push 到栈 B 3 将栈 B 的栈顶元素 pop 出 18 define Max CB 500 void LmiQueryCSmd StructMSgCB pmsg unsigned char ucCmdNum for ucCmdNum 0 ucCmdNum 6 puts 6 puts 6 原因是当表达式中存在有符号类型和无符号类型时所有的数都自动 转换为无符号类型 因此 20 变成了一个非常大的正整数 所以该表达式计算出 的结果大于 6 这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是 丰常重要的 如果你答错了这个问题 你也就到了得不到这份工作的边缘 1 2 宏定义 1 头文件中的 ifndef define endif 干什么用 标准答案 防止该头文件被重复引用 2 以下关于 typedef 的叙述中错误的是 A A 用 typedef 可以增加新的类型 B 用 typedef 可以定义各种类型名 但不能用来定义变量 C 用 typedef 只是将已有的类型用新的标识符来代表 D 使用 typedef 有利于程序的通用和移植 C 语言提供了 typedef 关键字 您可以使用它来为类型取一个新的名字 下面的实例为单字节数字定义了一个术语 BYTE typedef unsigned char BYTE 在这个类型定义之后 标识符 BYTE 可作为类型 unsigned char 的缩写 例如 BYTE b1 b2 按照惯例 定义时会大写字母 以便提醒用户类型名称是一个象征性的缩写 但您也可以使用小写字母 如下 typedef unsigned char byte 您也可以使用 typedef 来为用户自定义的数据类型取一个新的名字 例如 您可以对结构体使用 typedef 来定义一个新的数据类型名字 然后使用这个新的 数据类型来直接定义结构变量 define 是 C 指令 用于为各种数据类型定义别名 与 typedef 类似 但 是它们有以下几点不同 typedef 仅限于为类型定义符号名称 define 不仅可以为类型定义别名 也 能为数值定义别名 比如您可以定义 1 为 ONE typedef 是由编译器执行解释的 define 语句是由预编译器进行处理的 3 以下关于宏替换的叙述不正确的是 D A 宏替换只是字符替换 B 宏名无类型 C 宏替换不占用运行时间 D 宏替换不占用编译时间 4 用宏定义写出 swap x y 即交换两数 标准答案 define swap x y x x y y x y x x y 5 带参宏与带参函数的区别 至少说出 5 点 标准答案 带参宏 带参函数 处理时间 编译时 运行时 参数类型 无 需定义 程序长度 变长 不变 占用存储空间 否 是 运行时间 不占运行时间 调用和返回时占 6 已知一个数组 tabl e 用一个宏定义 求出数据的元素个数 标准答案 define NTBL table sizeof table sizeof table 0 7 用预处理指令 define 声明一个常数 用以表明 1 年中有多少秒 忽略 闰年问题 参考答案 define SECONDS PER YEAR 60 60 24 365 UL 如果不写 UL 后缀 系统默认为 int 即 有符号整数 8 Typedef 在 C 语言中频繁用以声明一个已经存在的数据类型的同义字 也可以用预处理器做类似的事 例如 思考一下下面的例子 define dPS struct s typedef struct s tPS 以上两种情况的意图都是要定义 dPS 和 tPS 作为一个指向结构 s 指针 哪 种方法更好呢 如果有的话 为什么 参考答案 这是一个非常微妙的问题 任何人答对这个问题 正当的原因 是应当被恭喜的 答案是 typedef 更好 思考下面的例子 dPS p 1 p2 tPS p3 p4 第一个扩展为 struct s p1 p2 上面的代码定义 p1 为一个指向结构的指 p2 为一个实际的结构 这也许不 是你想要的 第二个例子正确地定义了 p3 和 p4 两个指针 1 3 字符数组 1 void main char aa 10 printf d strlen aa 会出现什么问题 打印结果是是多少 标准答案 sizeof 和初不初始化 没有关系 strlen 和初始化有关 打印 结果值未知 2 strcpy 能把 strSrc 的内容复制到 strDest 为什么还要 char 类型的返 回值 答 为了增加灵活性如支持链式表达 1 4 指针 1 设有以下定义 int a 4 3 1 2 3 4 5 6 7 8 9 10 11 12 int prt 3 a p a 0 则下列能够正确表示数组元素 a 1 2 的表达式是 D A prt 1 2 B p 5 C prt 1 2 D a 1 2 数组指针解法 prt 1 2 prt 1 2 其实二维数组名 a 的类型就是 int 3 所以 prt 和 a 是等价的 2 若有定义 int a 3 4 不能表示数组元素 a 1 1 的是 C A a 1 1 B pw w 则对 w 数组元素的非法引用是 C A w 0 2 B pw 1 2 C pw 0 0 D pw 1 2 4 用变量 a 给出下面的定义 e 一个有 10 个指针的数组 该指针是指向一个整型数的 f 一个指向有 10 个整型数数组的指针 g 一个指向函数的指针 该函数有一个整型参数并返回一个整型数 h 一个有 10 个指针的数组 该指针指向一个函数 该函数有一个整型参数 并返回一个整型数 标准答案 e int a 10 f int a 10 g int a int h int a 10 int 理解 a 8 9 printf a p n a a 类型是 int 5 10 printf a 0 类型是 int 12 printf a 0 0 类型是 int 14 printf char str strcpy str hello printf str return 0 标准答案 没有为 str 分配内存空间 将会发生异常问题出在将一个字符 串复制进一个字符变量指针所指地址 虽然可以正确输出结果 但因为越界进行 内在读写而导致程序崩溃 6 int s 10 int 表示的是什么啊 标准答案 int s 10 int 函数指针数组 每个指针指向一个 int func intp aram 的函数 7 程序哪里有错误 wap int p1 int p2 int p p p1 p1 p2 p2 p 标准答案 p 为野指针 指向一个已删除的对象或未申请访问受限内存区 域的指针 8 要对绝对地址 0 x100000 赋值 我们可以用 unsigned int 0 x100000 1234 那么要是想让程序跳转到绝对地址是 0 x100000 去执行 应该怎么做 标准答案 void 0 x100000 首先要将 0 x100000 强制转换成函数指针 即 void 0 x100000 然后再调用它 void 0 x100000 9 嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点 在某 工程中 要求设置一绝对地址为 0 x67a9 的整型变量的值为 0 xaa66 编 译器是一个纯粹的 ANSI 编译器 写代码去完成这一任务 参考答案 这一问题测试你是否知道为了访问一绝对地址把一个整型数强 制转换 typecast 为一指针是合法的 这一问题的实现方式随着个人风格不同 而不同 典型的类似代码如下 int ptr ptr int 0 x67a9 ptr 0 xaa55 1 5 内存 1 Heap 与 stack 的差别 标准答案 Heap 是堆 stack 是栈 Stack 的空间由操作系统自动分配 释 放 Heap 上的空间手动分配 释放 Stack 空间有限 Heap 是很大的自由存储区 C 中的 malloc 函数分配的内存空间即在堆上 C 中对应的是 new 操作符 程序在编译期对变量和函数分配内存都在栈上进行 且程序运行过程中函数 调用时参数的传递也在栈上进行 1 6 算法 1 请编写一个 C 函数 该函数给出一个字节中被置 1 的位的个数 参考答案 unsigned int T estAsOne0 char log int i unsigned int num 0 val for i 0 i i 移位 val 与 1 相与 if val num return num 2 请编写一个 C 函数 该函数将给定的一个字符串转换成整数 参考答案 int Invert char str int num 0 while str 0 int d igital str 48 num num 10 digital str str 1 return num 3 实现 strcmp 函数 参考答案 int m ystrcmp const c har str1 const char str2 assert str1 NULL int r et 0 while ret unsigned char str1 unsigned char str2 str2 if ret 0 ret 1 else if ret 0 ret 1 return ret 4 请编写一个 C 函数 该函数在给定的内存区域搜索给定的字符 并返 回该字符所在位置索引值 参考答案 int s earch char cpSource intn char ch 起始地址 搜索长度 目标字符 int i for i 0 inext if NULL t2 t2 next next return 0 无环 if t1 t2 return 1 return 0 6 把一个链表反向 参考答案 从第一个元素开始 ps 指向他 将他 ps 指向头节点 ps next head 将 ps 设为头节点 head ps 操作下一个元素 ps pe next 等于 是依次将每个元素翻到原头节点前面 void reverse test head test pe head test ps head next while ps pe next ps next ps next head head ps ps pe next 7 输入一行字符 统计其中有多少个单词 参考答案 include main char str i ng 81 int i num 0 word 0 char c gets string for i 0 c string i 0 i if c word 0 else if word 0 word 1 num printf There are d word s in the line n num 8 有 1 2 3 4 个数字 能组成多少个互不相同且无重复数字的三位数 都是多少 参考答案 inc lude stdio h include conio h main int i j k printf n for i 1 i 5 i 以下为三重循环 for j 1 j 5 j for k 1 k 5 k if i k getch 9 计算字符串中子串出现的次数 参考答案 main char str1 20 str2 20 p1 p2 int sum 0 printf please input two strings n scanf s s str1 str2 p1 str1 p2 str2 while p1 0 if p1 p2 while p1 p2 p2 else p1 if p2 0 sum p2 str2 printf d sum getch 10 有两个磁盘文件 A 和 B 各存放一行字母 要求把这两个文件中的信息 合并 按字母顺序排列 输出到一个新文件 C 中 参考答案 main FILE fp in t i j n ni char c 160 t ch if fp fopen A r NULL printf file A cannot be opened n exit 0 printf nA contents are n for i 0 ch fgetc fp EOF i c i ch pu tc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论