c++经典面试笔试剖析
- 格式:pdf
- 大小:165.94 KB
- 文档页数:20
第1篇一、基础知识点1. 请简述C语言的发展历程。
C语言是由美国贝尔实验室的Dennis Ritchie在1972年发明的,它是一种高级程序设计语言,具有丰富的数据类型和运算符,广泛应用于系统软件、应用软件和嵌入式系统等领域。
C语言的发展历程大致可以分为以下几个阶段:(1)1972年:Dennis Ritchie开始设计C语言。
(2)1973年:C语言的第一个版本0.1发布。
(3)1975年:C语言的第一个正式版本C1发布。
(4)1978年:Brian Kernighan和Dennis Ritchie合著的《C程序设计语言》出版,使得C语言迅速流行。
(5)1983年:C语言的国际标准化组织(ISO)开始制定C语言标准,即C89标准。
(6)1990年:C语言的国际标准化组织发布了C90标准。
(7)2000年:C语言的国际标准化组织发布了C99标准。
2. 请简述C语言的特点。
C语言具有以下特点:(1)简洁、高效:C语言语法简单,执行效率高。
(2)跨平台:C语言编写的程序可以在不同的操作系统和硬件平台上运行。
(3)丰富的库函数:C语言提供了丰富的标准库函数,方便程序员进行编程。
(4)可移植性:C语言编写的程序具有较好的可移植性,可以在不同的环境下编译和运行。
(5)模块化:C语言支持模块化编程,便于代码的重用和维护。
3. 请简述C语言的数据类型。
C语言的数据类型分为以下几类:(1)基本数据类型:int、float、double、char等。
(2)枚举类型:enum。
(3)结构体类型:struct。
(4)联合体类型:union。
(5)指针类型:void。
(6)数组类型:数组是具有相同数据类型元素集合的实体。
4. 请简述C语言的基本语法。
C语言的基本语法包括:(1)标识符:标识符用于命名变量、函数、数组等。
(2)关键字:关键字是C语言中预定义的具有特殊含义的单词。
(3)运算符:C语言提供了丰富的运算符,包括算术运算符、关系运算符、逻辑运算符等。
c面试试题及答案一、自我介绍你好,我是XXX,很高兴有机会参加C面试。
我具备扎实的编程基础和丰富的项目经验,在此次面试中,我将展示我的能力和潜力。
谢谢!二、C语言基础知识1. 请解释C语言中的指针(pointer)是什么?指针是一种变量,它存储了内存地址。
通过指针,我们可以直接访问和修改内存中的数据。
指针的灵活性使得我们可以在C语言中进行高效的内存管理和操作。
2. 请描述C语言中的动态内存分配的过程及对应的函数。
动态内存分配是在程序运行时按需分配和释放内存的过程。
在C语言中,使用malloc函数动态分配内存,使用free函数释放已分配的内存。
具体分配内存的大小和释放内存的时机需要根据具体需求来决定。
3. 什么是结构体(struct)?如何定义和使用结构体?结构体是一种自定义的数据类型,它可以将不同类型的数据按照一定的组织方式打包在一起。
在C语言中,我们可以使用struct关键字定义结构体,并通过点操作符(.)来访问结构体成员。
4. C语言中的位运算符有哪些,分别用于什么场景?C语言中常用的位运算符有按位与(&)、按位或(|)、按位异或(^),它们用于对二进制数进行位级操作。
位运算可以在一些特定场景中提高程序的运行效率,如位掩码、位标记等。
三、编程题请编写一个C语言程序,实现冒泡排序算法。
```c#include <stdio.h>void bubbleSort(int arr[], int size) {int i, j, temp;for (i = 0; i < size - 1; i++) {for (j = 0; j < size - i - 1; j++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}int main() {int arr[] = {5, 2, 9, 3, 7};int size = sizeof(arr) / sizeof(arr[0]);bubbleSort(arr, size);printf("排序结果:");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}return 0;}```这个程序实现了冒泡排序算法,将数组中的元素按照升序排列,并输出排序结果。
c 常见面试题面试是求职过程中非常重要的环节,通过面试,雇主能够更加了解应聘者的能力、经验和适应能力。
常见面试题围绕着应聘者的个人情况、工作经历、技能与能力等方面展开。
本文将就常见面试题进行解析和答题技巧分享,以帮助应聘者更好地应对面试。
一、个人情况介绍1. 自我介绍自我介绍是面试中必不可少的一环。
应聘者应该在自我介绍中包括自己的姓名、年龄、学历、专业背景以及与应聘岗位相关的工作经验或技能。
此外,应聘者还可以简要介绍自己的个人爱好、性格特点或者未来职业规划。
2. 为什么选择你应聘的这个职位?在回答这个问题时,应聘者要突出自己对应聘职位的热情,并结合自身的能力、经验和兴趣说明自己为什么适合这个职位。
回答时可以给出自己对该职位的认识和了解,以及对能够为公司带来的价值的看法。
二、工作经历1. 请介绍一下你过去的工作经历。
回答这个问题时,应聘者应该将工作经历按照时间顺序进行介绍。
可以简要介绍每个工作的职责和成就,并突出与应聘职位相关的工作经验。
2. 你遇到过怎样的工作困难?你是如何解决的?面试官通过这个问题想了解应聘者在工作中遇到问题时的解决能力。
应聘者在回答时可以结合具体的事例,说明遇到的困难以及自己的解决方法和效果。
三、技能与能力1. 你有哪些专业技能和专长?应聘者可以列举自己在专业领域的技能和专长,例如熟练掌握某种编程语言、项目管理经验、团队合作能力等。
回答时要注重与应聘职位的相关性,并结合具体事例进行说明。
2. 你是如何处理工作中的压力和挑战的?这个问题考察应聘者的应变能力和情绪管理能力。
应聘者在回答时可以提到自己的一些应对压力的方法,例如做运动、分解任务、寻求帮助等,并举例说明自己如何成功应对过工作中的挑战。
四、职业规划与发展1. 你的职业规划是什么?应聘者在回答时可以表达自己对未来职业的期望和计划,以及对公司发展的认同和愿景。
回答时要积极展示自己的进取心和发展意愿。
2. 你的长期和短期目标是什么?应聘者可以结合自身情况,提出一些实际可行的目标,并说明达成这些目标的计划和努力方向。
c的面试题及答案面试题一:请解释一下C语言的指针和引用的区别。
答案:在C语言中,指针和引用都是用来处理内存地址的。
它们的主要区别在于以下几个方面:1. 定义和使用方式:- 指针是一个变量,存储的是一个内存地址。
通过使用"*"操作符可以获取或修改该地址对应的值。
- 引用则是一个已存在对象的别名。
它在定义时需要和原对象进行绑定,并且无法更改绑定的对象。
2. 空指针和无效引用:- 指针可以被赋值为空指针(NULL)或无效的地址值,表示指针不指向任何有效的内存地址。
- 引用必须在定义时进行初始化,并且必须引用一个有效的对象。
3. 内存管理:- 指针需要显式地通过动态内存分配函数(如malloc())进行内存的分配和释放。
- 引用的内存管理则由编译器自动处理,无需手动管理。
4. 数组和函数的传递:- 指针可以用于处理数组或者作为函数的参数进行传递。
- 引用可以作为函数参数,但无法直接用于处理数组。
面试题二:请解释C语言中的堆和栈的区别。
答案:在C语言中,堆和栈是两种不同的内存分配方式,具有以下区别:1. 分配方式:- 栈是由编译器自动分配和释放的,它的空间有限,大小在编译时就已经确定。
- 堆是由程序员手动分配和释放的,它的空间相比栈更大,并且大小在运行时可动态调整。
2. 内存结构:- 栈的数据结构为“先进后出”的方式,即后进栈的数据先出栈。
- 堆则没有明确的数据结构,按照动态分配顺序分配内存。
3. 分配效率:- 栈的分配和释放速度要快于堆,因为栈只需要移动栈顶指针即可。
- 堆的分配和释放速度相对较慢,因为需要在运行时进行内存的动态分配和回收。
4. 使用方式:- 栈主要用于存储局部变量、函数调用和函数参数等数据。
- 堆主要用于存储动态分配的内存,如通过malloc()函数分配的内存块。
面试题三:请解释C语言中的宏定义和常量的区别。
答案:在C语言中,宏定义和常量都可以用来表示不可更改的值,但它们的区别如下:1. 定义方式:- 宏定义使用“#define”关键字进行定义,没有数据类型限制。
第一章:概念定义篇1.1、局部变量能否和全局变量重名?解答:能。
在局部变量的作用域内,局部变量会屏蔽掉同名的全局变量。
此时若需要使用全局变量,需要使用”::”符号(linux中必须使用g++编译,使用gcc时并不识别域操作符::)。
深度解析:C语言中有“作用域”的概念。
譬如全局变量作用域为整个文件(准确的说是定义该全局变量的文件中该变量定义/声明之后的部分。
只不过一般情况下全局变量都在文件头部定义,因此说全局变量为文件作用域。
),局部变量为代码块作用域。
所谓代码块作用域,代码块是指用一对大括号{}括起来的部分(譬如一个函数的函数体,for循环的循环体等)。
也就是说局部变量的作用域其实是定义这个局部变量的代码块中该变量定义体之后的部分。
这样看来,至少得到以下两个结论:(1)变量的作用域是有大有小的(2)变量的作用域是有重叠部分的。
譬如在一个函数内,该函数的局部变量和整个文件的全局变量都覆盖这个作用域,这就是作用域的重叠。
重叠作用域中,如果全局变量名和局部变量名不同不会造成困扰。
因为我们可以很容易的通过变量名来区分两个变量(我们班有个叫旺财的,别人班有个叫富贵的,我叫旺财你肯定知道我要找的是谁吧!)。
但是在两个变量名相同时要怎么办呢(我们班有个旺财,隔壁班也有个旺财,我在走廊里喊一声旺财,你觉得我在叫谁···)?这种情况逻辑学上叫二义性(ambiguity)。
即有两种可能的解释,却没有任何区分的方法。
怎么办呢?人为规定嘛。
C语言规定:在变量作用域重叠时,作用域为小范围的变量覆盖大范围的变量。
譬如函数内有个局部变量var,文件内有个全局变量var。
则在该函数内部(准确的说是函数内部var局部变量定义体之后的部分),你使用var访问的是var局部变量,此处全局变量var被掩蔽(要想在此处访问全局变量var,对于C++可以使用::符号,而C语言中则没有域操作符::)1.2、堆栈溢出一般是什么原因导致的?解答:堆栈溢出一般都是由堆栈越界访问导致的。
C语言面试题总结下面是我在软通动力的一些面试题,虽然有些模糊了,但是都还是在面试中经常会看到的一些题,而且通过我面试的这些题,也总结了一些面试经验,这些都是面试时你必须要做好的。
首先看面试题吧。
1,写一个单链表,储存1,2,3,然后写一个函数让其内存反转,3,2,1。
2,忘了3,C字符串,this is a test!,反转,结果为:test! a is this.4,约瑟夫环。
5,输出所有小于N(>0)的质数------------------------------算法:排列组合,如:1,2,3。
所有输出为:1 2 3 ; 2 1 3 等六种.面试职位:C开发工程师面试题:1用两个栈实现一个队列,描述算法。
2树的遍历方式有几种,如果按先序遍历出来的数存放到一个数组,则数组下标和节点位置的对应关系。
3从变量的作用域角度变量可分为几种。
4做不做代码的单元化测试。
5同事之间如何沟通项目。
6什么是字节对齐,为什么要对齐?如果不对齐产生什么后果。
7数组和链表的区别。
1.画出TCP/IP模型结构图,IP报头都有那些部分组成。
2.VLANtag有那几部分组成,分别占用几个bit。
3.简述交换机路由器的工作原理。
4.可以根据什么划分VLAN,划分VLAN有什么好处。
5.OSI七层模型数据封装顺序。
6.上行接口200MAC,丢失。
下行接口500MAC,接受。
设备总共能学到多少7.OSPF是IGP,广播型网络和NBMA网络要选举DR8.距离矢量路由协议中解决环路的方法;水平分割9.ICMP协议的功能等。
10.子网划分的题,选择给出的子网地址包含下面哪些IP11.七层模型中网络层和传输层的作用。
笔试部分我只能记得这么多了。
面试的时候,面试官看完我的简历从简历中挑了几个问题:1.做过的几个项目中哪个是最满意的;2.为什么划分VLAN3.BGP有那几种4.QOS是做什么用的,配置过没有5.自己认为自己有那些优点,当遇到问题时会怎么办,能不能吃苦,适应加班。
C/C++ 程序设计员应聘常见面试试题深入剖析本文的写作目的并不在于提供C/C++程序员求职面试指导,而旨在从技术上分析面试题的内涵。
文中的大多数面试题来自各大论坛,部分试题解答也参考了网友的意见。
许多面试题看似简单,却需要深厚的基本功才能给出完美的解答。
企业要求面试者写一个最简单的strcpy函数都可看出面试者在技术上究竟达到了怎样的程度,我们能真正写好一个strcpy函数吗?我们都觉得自己能,可是我们写出的strcpy很可能只能拿到10分中的2分。
读者可从本文看到strcpy函数从2分到10分解答的例子,看看自己属于什么样的层次。
此外,还有一些面试题考查面试者敏捷的思维能力。
分析这些面试题,本身包含很强的趣味性;而作为一名研发人员,通过对这些面试题的深入剖析则可进一步增强自身的内功。
2.找错题试题1:以下是引用片段:void test1(){char string[10];char* str1 = "0123456789";strcpy( string, str1 );}试题2:以下是引用片段:void test2(){char string[10], str1[10];int i;for(i=0; i<10; i++){str1= ''a'';}strcpy( string, str1 );}试题3:以下是引用片段:void test3(char* str1){char string[10];if( strlen( str1 ) <= 10 ){strcpy( string, str1 );}}解答:试题1字符串str1需要11个字节才能存放下(包括末尾的’\0’),而string 只有10个字节的空间,strcpy会导致数组越界;对试题2,如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string,str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10分;对试题3,if(strlen(str1) <= 10)应改为if(strlen(str1) <10),因为strlen的结果未统计’\0’所占用的1个字节。
c类面试真题及答案解析C类面试真题及答案解析在职场竞争日益激烈的今天,许多人选择参加C类考试来提升自己的竞争力。
C类面试是其中的重要环节,它旨在考察应聘者的综合素质和能力。
下面就C类面试真题及其答案解析进行讨论。
一、问题一:请简单介绍一下你自己。
回答分析:这是一个经典的开场问题,面试官通过这个问题了解应聘者的个人背景和经历。
在回答时,应聘者要突出自己的优势和能力。
举例来说,面试者可以介绍自己的教育背景、实习经历以及个人特长。
此外,还可以结合工作岗位的要求,强调与之相关的工作经验和技能。
二、问题二:请谈一谈你在之前工作中的最大成就。
回答分析:这个问题是考察应聘者的工作能力和成就感。
在回答时,应聘者应该选择一个与所应聘职位相关的成就,并详细描述其过程和结果。
应聘者可以从以下几个方面展开回答:项目经验、团队合作、解决问题的能力等。
同时,应聘者还要注意突出个人的贡献和领导能力。
三、问题三:请谈一谈你未来的职业规划。
回答分析:这个问题考察应聘者的发展方向和目标。
在回答时,应聘者应该做到明确和具体。
可以结合自己的专业背景和兴趣,提出一个合理的职业规划。
同时,应聘者还要展示自己的学习能力和进取心,表明自己的意愿和能力去实现这一规划。
四、问题四:请谈一谈你在前任领导中的优点和缺点。
回答分析:这个问题考察应聘者的自我认知和工作态度。
在回答时,应聘者要真实客观地评价自己的优点和缺点。
对于优点,可以结合工作经验和实际情况来回答。
对于缺点,应聘者可以提出并说明自己的改进计划和努力方向。
五、问题五:如果你被录用,你认为你能为这个岗位做出什么贡献?回答分析:这个问题考察应聘者的工作潜力和适应能力。
在回答时,应聘者要针对职位要求,提出具体的可行性方案。
可以结合自己的工作经验和专业知识,说明自己能够为公司带来什么样的价值和贡献。
六、问题六:你认为哪些品质是成功的关键?回答分析:这个问题考察应聘者对成功的理解和个人价值观。
在回答时,应聘者可以提出自己认为的成功品质,并说明其重要性和具体的体现方式。
C/C++ 程序设计员应聘常见面试笔试试题深入剖析1.引言 本文的写作目的并不在于提供C/C++程序员求职面试指导,而旨在从技术上分析面试题的内涵。
文中的大多数面试题来自各大论坛,部分试题解答也参考了网友的意见。
许多面试题看似简单,却需要深厚的基本功才能给出完美的解答。
企业要求面试者写一个最简单的strcpy函数都可看出面试者在技术上究竟达到了怎样的程度,我们能真正写好一个strcpy函数吗?我们都觉得自己能,可是我们写出的strcpy很可能只能拿到10分中的2分。
读者可从本文看到strcpy函数从2分到10分解答的例子,看看自己属于什么样的层次。
此外,还有一些面试题考查面试者敏捷的思维能力。
分析这些面试题,本身包含很强的趣味性;而作为一名研发人员,通过对这些面试题的深入剖析则可进一步增强自身的内功。
2.找错题 试题1:void test1(){ char string[10]; char* str1 = "0123456789"; strcpy( string, str1 );} 试题2:void test2(){ char string[10], str1[10]; int i; for(i=0; i<10; i++) { str1 = 'a'; } strcpy( string, str1 );} 试题3:void test3(char* str1){ char string[10]; if( strlen( str1 ) <= 10 ) { strcpy( string, str1 ); }} 解答: 试题1字符串str1需要11个字节才能存放下(包括末尾的’\0’),而string只有10个字节的空间,strcpy会导致数组越界; 对试题2,如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string, str1)调用使得从str1[url=]内存[/url]起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10分; 对试题3,if(strlen(str1) <= 10)应改为if(strlen(str1) < 10),因为strlen的结果未统计’\0’所占用的1个字节。
剖析: 考查对基本功的掌握: (1)字符串以’\0’结尾; (2)对数组越界把握的敏感度; (3)库函数strcpy的工作方式,如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案: 2分void strcpy( char *strDest, char *strSrc ){ while( (*strDest++ = * strSrc++) != ‘\0’ );} 4分void strcpy( char *strDest, const char *strSrc )//将源字符串加const,表明其为输入参数,加2分{ while( (*strDest++ = * strSrc++) != ‘\0’ );} 7分void strcpy(char *strDest, const char *strSrc){ //对源地址和目的地址加非0断言,加3分 assert( (strDest != NULL) && (strSrc != NULL) ); while( (*strDest++ = * strSrc++) != ‘\0’ );} 10分//为了实现链式操作,将目的地址返回,加3分!char * strcpy( char *strDest, const char *strSrc ){ assert( (strDest != NULL) && (strSrc != NULL) ); char *address = strDest; while( (*strDest++ = * strSrc++) != ‘\0’ ); return address;} 从2分到10分的几个答案我们可以清楚的看到,小小的strcpy竟然暗藏着这么多玄机,真不是盖的!需要多么扎实的基本功才能写一个完美的strcpy啊! (4)对strlen的掌握,它没有包括字符串末尾的'\0'。
读者看了不同分值的strcpy版本,应该也可以写出一个10分的strlen函数了,完美的版本为: int strlen( const char *str ) //输入参数const{ assert( strt != NULL ); //断言字符串地址非0 int len; while( (*str++) != '\0' ) { len++; } return len;} 试题4:void GetMemory( char *p ){ p = (char *) malloc( 100 );}void Test( void ){ char *str = NULL; GetMemory( str ); strcpy( str, "hello world" ); printf( str );} 试题5:char *GetMemory( void ){ char p[] = "hello world"; return p;}void Test( void ){ char *str = NULL; str = GetMemory(); printf( str );} 试题6:void GetMemory( char **p, int num ){ *p = (char *) malloc( num );}void Test( void ){ char *str = NULL; GetMemory( &str, 100 ); strcpy( str, "hello" ); printf( str );} 试题7:void Test( void ){ char *str = (char *) malloc( 100 ); strcpy( str, "hello" ); free( str ); ... //省略的其它语句} 解答: 试题4传入中GetMemory( char *p )函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完char *str = NULL;GetMemory( str ); 后的str仍然为NULL; 试题5中char p[] = "hello world";return p; 的p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。
这是许多程序员常犯的错误,其根源在于不理解变量的生存期。
试题6的GetMemory避免了试题4的问题,传入GetMemory的参数为字符串指针的指针,但是在GetMemory中执行申请内存及赋值语句*p = (char *) malloc( num ); 后未判断内存是否申请成功,应加上:if ( *p == NULL ){ ...//进行申请内存失败处理} 试题7存在与试题6同样的问题,在执行char *str = (char *) malloc(100); 后未进行内存是否申请成功的判断;另外,在free(str)后未置str 为空,导致可能变成一个“野”指针,应加上:str = NULL; 试题6的Test函数中也未对malloc的内存进行释放。
剖析: 试题4~7考查面试者对内存操作的理解程度,基本功扎实的面试者一般都能正确的回答其中50~60的错误。
但是要完全解答正确,却也绝非易事。
对内存操作的考查主要集中在: (1)指针的理解; (2)变量的生存期及作用范围; (3)良好的动态内存申请和释放习惯。
再看看下面的一段程序有什么错误:swap( int* p1,int* p2 ){ int *p; *p = *p1; *p1 = *p2; *p2 = *p;} 在swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。
在VC++中DEBUG运行时提示错误“AccessViolation”。
该程序应该改为:swap( int* p1,int* p2 ){ int p; p = *p1; *p1 = *p2; *p2 = p;}[img=12,12]file:///D:/鱼鱼软件/鱼鱼多媒体日记本/temp/{56068A28-3D3B-4D8B-9F82-AC1C3E9B128C}_arc_d[1].gif[/img] 3.内功题 试题1:分别给出BOOL,int,float,指针变量 与“零值”比较的if 语句(假设变量名为var) 解答: BOOL型变量:if(!var) int型变量: if(var==0) float型变量: const float EPSINON = 0.00001; if ((x >= - EPSINON) && (x <= EPSINON) 指针变量: if(var==NULL) 剖析: 考查对0值判断的“内功”,BOOL型变量的0判断完全可以写成if(var==0),而int型变量也可以写成if(!var),指针变量的判断也可以写成if(!var),上述写法虽然程序都能正确运行,但是未能清晰地表达程序的意思。
一般的,如果想让if判断一个变量的“真”、“假”,应直接使用if(var)、if(!var),表明其为“逻辑”判断;如果用if判断一个数值型变量(short、int、long等),应该用if(var==0),表明是与0进行“数值”上的比较;而判断指针则适宜用if(var==NULL),这是一种很好的编程习惯。
浮点型变量并不精确,所以不可将float变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。
如果写成if (x == 0.0),则判为错,得0分。
试题2:以下为Windows NT下的32位C++程序,请计算sizeof的值void Func ( char str[100] ){ sizeof( str ) = ?}void *p = malloc( 100 );sizeof ( p ) = ? 解答:sizeof( str ) = 4sizeof ( p ) = 4 剖析: Func ( char str[100] )函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。