最好最全最新的C、C++笔试面试题汇总.pdf

所需积分/C币:10 2012-10-30 15:19:04 755KB PDF

最好最全最新的C、C++笔试面试题汇总,希望你能有用!
静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避 免在其它源文件中引起错诶 从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的 生存期。把仝局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。 函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为 内部函数,内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用 的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件 全局变量与普通的全局变量有什么区别:全局变量只初使化一次,防止在其他文 件单元中被引用 局部变量和普通局部变量有什么区别:局部变量只被初始化一次,卜一次依据上 一次结果值 函数与普通函数有什么区别 凼数在内存中只有一份,普通函数在每个被调用中 维持一份拷贝 、程序的内存分配 答:一个由编译的程序占用的内存分为以下几个部分 栈区()—由编译器自动分配释放,存放数的参数值,局部变量的值等。其操作 方式类似于数据结构中的栈。 堆区()—·般由程序员分配释放,若程序员不释放,程序结束吋可能由回收 注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 、全局区(静态区)()一全局变量和静态变量的存储是放在·块的,初始化的全局 变量和静态变量在一块区域,未初始化的仝局变量和未初始化的静态变量在相邻的另一块区 域。程序结束后由系统释放 、文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。 、程序代码区一存放函数体的二进制代码 例子程序 这是一个前辈写的,非常详细 全局初始化区 仝局未初始化区 栈 char s[]=”abc”;∥栈 栈 char*p3=”123456”;/123456在常量区,在栈上。 全局(静态)初始化区 分配得来得和字节的区域就在堆区。 strcpy(p1;"123456″);123456放在常量区,编译器可能会将它与所向”123456′优化成 个地方。 、解释堆和栈的区别 答:堆()和栈 的区别 ()申请方式 由系统自动分配。例如,声明在函数中一个局部变量系统自动在栈中为开辟空 需要程序员自凵中请,并指明大小,在中 函数 如 在中用运算符 但是注意 本身是在栈中的。 ()申请后系统的响应 栈:只耍栈的剩余空间大丁所中请空间,系统将为程序提供内存,否则将报异常提示栈溢出 堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时 会遍历该链衣,寻找第个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中 删除,并将该结点的空间分配给程序,另外,对于人多数系统,会在这块内存空间中的首地 址处记录本次分配的大小,这样,代码中的语句才能正确的释放本内存空间。另外 由于找到的堆结点的人小不一定正好等于中请的人小,系统会自动的将多余的那部分重新放 入空闲链表中 ()中请大小的限制 栈:在 下栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意 思是栈顶的地址和栈的最大容量是系统预先规定好的,在 下,栈的大小是(也 有的说是,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将 提示 。因此,熊从栈获得的空间较小。 堆:堆是向髙地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的 空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址冋高地址。堆的大小受限 于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。 ()申请效率的比较 栈由系统自动分配,速度较快。但程序员是无法控制的 堆是由分配的内存,一般速度比较慢,而且容易产生内存碎片不过用起来最方便 另外,在 下,最好的方式是用 分配内存,他不是在堆,也不是在 栈而是直接在进程的地址空间中保留一块内存,虽然用起来最不方使。但是速度快,也最 灵活。 ()堆和栈中的存储内容 栈:在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执 行语句)的地址,然后是函数的各个参数,在大多数的编译器中,参数是由右往左入栈 的,然后是函数中的局部变量。注意静态变量是不入栈的 当本次函数调用结束后,局部变量先岀栈,然后是参数,最后栈顶指针指向最开始存的地址, 也就是主函数中的下一条指令,程序由该点继续运行。 堆:一般是在堆的头部用一个字节存放堆的大小。堆中的只体内容由程序员安排。 ()存取效率的比较 char sl” Raaaaaaaaaaaaaa”; char *s2=bbbbbbbbbbbbbbbbb 是在运行时刻赋值的; 而 是在编译时就确定的 但是,在以后的存取中,在栈上的数组比指针所指向的字符串例如堆快。 比如 char c]=”1234567890′ char*p=”1234567890 对应的汇编代码 第一种在读取时直接就把字符串中的元素读到寄存器中,而第和则要先把指针值读到 中,在根据读取字符,显然慢了 、什么是预编译何时需要预编译 答:预编译乂称为预处理是做些代码文木的替换工作。处理开头的指令比如拷贝 包含的文件代码, 宏定义的替换条件编译等,就是为编译做的预备工作的阶段,主 要处理开始的预编译指令,狈编详指令指小∫在程序正式编详前就由编译器进行的操作, 可以放在程序中的任何位置。 编详系统在对程序进行通常的编译之前,先进行顶处理。提供的顶处理功能主要有以下 三种:)宏定义)文件包含)条件编译 总是使用不经常改动的大型代码体 2、程序由多个模块组成,所冇模块都使用一组标准的包含文件和相同的编译选项。在这种 情况下,可以将所有包含文件顶编详为一个顶编详头。 、关键字是什么含意? 答:我只要一听到被面试者说:‘ const意味着常数”,我就知道我正在和一个业余者打交道。 去年 已经在他的文章里完全概括了的所有用法,因此译者 的每一位读者应该非常熟悉能做什么和不能做什么如果你从没 有读到那篇文章,只要能说出意味着“只读”就可以了。尽管这个答案不是完全的答案, 但我接受它作为一个正确的答案。(如果你想知道更详细的答案,仔细读一卜的文章 吧。)如果应试者能正确回答这个问题,我将问他一个附加的问题:下面的声明都是什么意 ? 前两个的作用是·样,是·个常整型数。第三个意味着是个指向常整型数的指针(也 就是,整型数是不可修改的,但指针可以)。第四个意思是一个指向整型数的常指针(也 就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着是 指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可 修改的)。如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。顺带提一句」 也许你可能会问,即使不用关键字 也还是能很容易写出功能正确的程序,那么我为 什么还要如此看重关键字呢?我也如下的几下理由 关键字 的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数 为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃 圾,你就会很快学会感谢这点多余的信息。(当然,懂得用的程序员很少会留下的垃 圾让别人来清理的。) 通过给优化器一些附加的信息,使用关键字也许能产生更紧凑的代码。 合理地使用关键字可以使编译器很自然地保护那些不希望被改变的参数,防止其 被无意的代码修改。简而言之,这样可以减少的出现 、关键字 有什么含意并给出三个不同的例子。 答:一个定义为 的变量是说这变量可能会被意想不到地改变,这样,编译器就不会 厶假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读 取这个变量的值,而不是使用保存在寄存器里的备份。下面是 变量的几个例子: 并行设备的硬件寄存器(如:状态寄存器) 个中断服务子程序中会访问到的非自动变量 多线程应用中被几个任务共享的变量 回答不出这个问题的人是不会被雇佣的。我认为这是区分程序员和嵌入式系统程序员的 最基本的问题。嵌入式系统程序员经常同硬件、中断、 等等打交道,所用这些都要求 变量。不懂得 内容将会带来灾难 假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将硝微深究一下,看 下这家伙是不是直正懂得 完全的重要性。 一个参数既可以是还可以是 吗?解释为什么。 个指针可以是 吗?解释为什么。 下面的函数有什么错误: 下面是答案: 是的。一个例子是只读的状态寄存器。它是 因为它可能被意想不到地改变。它 是因为程序不应该试图去修改它。 是的。尽管这并不很常见。一个例子是当一个中服务子稈序修该一个指向一个的 指针时。 这段代码的有个恶作剧。这段代码的目的是用来返指针指向值的平方,但是,由于 指向一个 型参数,编译器将产生类似下面的代码 由于的值可能被意想不到地该变,因此和可能是不同的。结果,这段代码可能返不 是你所期望的平方值!正确的代码如下: 三种基本的数据模型 答:按照数据结构类型的不同,将数据模型划分为层次模型、网状模型和关系模型。 、结构与联合有和区别? 答:结构和联合都是由多个不同的数据关型成员组成但在任何同一时刻联合中只存 放了一个被选中的成员(所有成员共用一块地址空间)而结构的所有成员都存在(不同成 员的存放地址不同)。 对于联合的不同成员赋值将会对其它成员重写原来成员的值就不存在了而对于结 构的不同成员赋值是互不影响的 描述内存分配方式以及它们的区别 答:)从静态存储区域分配。内存在程序编译的时候就凵经分配好,这块内存在程序的整 个运行期间都存在。例如全局变量, 变量。 )在栈上创建。在执行凶数时,函数内局部变量的存储单元都可以在栈上创建,函数执行 结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。 )从堆上分配,亦称动态内存分配。程序在运行的吋候用 或申请任意多少的 内存,程序员自己负责在何时用或释放内存。动态内存的生存期由程序员决定, 使用非常灵活,但问题也最多 、请说出与相比,有何优点? 答:作用:定义常量、修饰函数参数、修饰函数返回值三个作用。被修饰的东 西都受到强制保护,可以预防意外的变动,能提高稈序的健壮性。 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。 而对后者只进行字符替换,没有类型安仝检查,并且在字符替换可能会产生意料不到的错误。 )有些集成化的调试工具可以对常量进行调试,但是不能对宏常量进行调试。 、简述数组与指针的区别? 答:数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向 任意类型的内存块 修改内容上的差别 char a[-"hello aO]=“X,; char*p=“ world’;∥注意指向常量字符串 p]=^X’;∥编译器不能发现该错误,运行时错误 用运算符可以计算出数组的容量(字节数)。 为指针得到的是一个指 针变量的字节数,而不是所指的内存容量。 语言没有办法知道指针所指的内存容 量,除非在申请内存时记住它意当数组作为函数的参数进行传递时,该数组自动退化为 司类型的指针 har a[="hello world 字节 字节 计算数组和指针的内存容量 字节而不是字节 、分别写出 指针类型的变量与零”的比较语句。 答: 、如何判断一段程序是由编译程序还是由编译稈序编译的? 答: 论述含参数的宏与函数的优缺点 答:帮参宏函数 处理时间编译时程序运行时 参数类型没有参数类型问题定义实参、形参类型 处理过程不分配内存分配内存 程序长度变长不变 运行速度不占运行时间调用和返回占用时间 、用两个栈实现一个队列的功能?要求给出算法和思路 答、设个栈为一开始均为空 入队 将新元素栈 出队 判断栈是否为空; 如果不为空,则将栈中所有元素依次出并到栈 将栈的栈顶元素出; 这样实现的队列入队和出队的平摊复杂度都还是比上面的几种方法要好 、嵌入式系统中经常要用到无限循坏,你怎么样用编写死循环呢? 答:这个问题用几个解决方案。我首选的方案是: 一些程序员更喜欢如下方案: 这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这 个作为方案,我将用这个作为一个机会去探究他们这样做的 基本原理。如果他们的基本答案是:“我被教着这样做,但从没有想到过为什么。”这会给我 留卜一个坏印象 第三个方案是用 应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是 个想进入新领域的 程序员。 、位操作( 答:嵌入式系统总是要用户对变量或奇存器进行位操作。给定个整型变量,写两段代 码,第一个设置的,第二个清除的。在以上两个操作中,要保持其它位不变 对这个问题有三种基本的反应 不知道如何下手。该被面者从没做过任何嵌入式系统的工作。 用 是被扔到语言死角的东西,它保证你的代码在不同编译器之间 是不可移植的,同时也保证了的你的代码是不可重用的。我最近不幸看到 为其较 复杂的通信芯片写的驱动程序,它用到了 因此完全对我无用,因为我的编译器用其 它的方式来实现 的。从道德讲:永远不要让一个非嵌入式的家伙粘实际硬件的边。 用 和 操作。这是一个有极高可移植性的方法,是应该被用到的方法。 最住的解决方案如下:

...展开详情

评论 下载该资源后可以进行评论 2

qq_32657835 不错,很全面
2017-03-03
回复
蔡奕鑫 不错!挺全的,也挺有条理的
2012-10-30
回复
img
itxiaocniao
  • 分享宗师

    成功上传21个资源即可获取

关注 私信 TA的资源

上传资源赚积分,得勋章
最新资源