【C语言面试复试汇总】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

C语言面试复试汇总

什么是预编译,何时需要预编译

程序执行前的预处理工作。

总是使用但不经常改动。

程序由多个模块组成,所有模块都是用一组标准的包含文件和相同的编译选项,这种情况下可以把所有包含文件预编译为一个预编译头

continue 和break的区别

break可用于switch语句,表示跳出整个switch块,而continue不能用于switch语句

两者都可用于循环语句,break立即退出循环体,switch仅跳出当次循环

static关键字的作用?

修饰局部变量:保持变量内容的永久性不会因为函数调用结束而被销毁

修饰全局变量:使之只能在源文件使用

修饰函数:使之只能在源文件使用

const关键字的作用?

定义一个常量,内容不能被改变

volatile关键字的作用?

声明的变量随时会因为意外被改变

extern 关键字的作用?

提示被引用变量是外部变量,在其他源文件被定义

sizeof关键字的作用

函数的作用是返回对象所占内存字节数

函数参数入栈的顺序

自右向左依次压栈

i++ ++i得区别 a=a>>1 a=a<<1的区别

i++是先赋值后加一

++i是先加一后赋值

a=a>>1 a右移一位 表示a除以2

a=a<<1 a左移一位 表示a乘以2

void关键字的作用

修饰返回值:声明函数没有返回值

修饰函数参数:声明函数没有参数

什么是算法,什么是算法复杂度

算法是指在解决问题时,按照某种步骤可以得到问题结果的处理过程

算法的复杂度指的是算法在运算过程中所需要占用的运行时间和存储空间的多少

算法分析的目的是什么

是为了建立衡量算法优劣的标准,为了比较同一问题的不同算法。为了对算法某种特定输入,估算该算法所需内存和运行时间

一个算法应具有五个重要特征

有穷性:算法必须能在执行有限个步骤后终止

确切性:算法的每一个步骤必须有确切的定义

输入项:一个算法有零个或多个输入

输出项:一个算法有一个或多个输出,以反应对输入数据加工后的结果

可行性:算法中执行的任何计算步骤都可以被分解为基本的可执行的操作步骤

如何判定一个算法的好坏

正确性:任何合法的输入都有正确的输出

可读性:算法创建后由人来阅读理解使用以及修改

健壮性:当输入非法数据时,不会产生不好的结果

时间复杂度和空间复杂度:算法运行所需要的时间以及所需要的内存少

数据结构的作用:

组织存储数据。数据结构提供一种有效的方式来组织和存储数据,使得程序能够快速访问操作数据。

提高程序的效率

提高程序的可读性和可维护性

头文件的作用

头文件包含一些写好的函数和变量,引入头文件可以引用这些函数和变量

c语言采用哪些措施提高执行效率

使用指针

使用宏函数

使用位操作

长内短外嵌套循环

if语句和switch的区别

if由多个条件构成分支,switch由一个表达式构成分支

简述值传递和地址传递

值传递:调用函数时将实参的值复制给形参,两者互相不影响

地址传递:调用函数时将实参的地址传递给形参,实参形参为同一内容,修改形参的值直接影响实参

什么基本类型能做switch的参数

只有基本数据类型 int char 而long float 不行

c语言的存储特性可以分为几类,以及特点

局部变量:函数中所有的非静态局部变量,仅作用于当前函数存储在栈区

静态变量:在变量前加static的变量,存储在静态存储区

外部变量:一般用作全局变量的扩展,通过extern声明

寄存器变量:被经常使用的变量一般被设置为寄存器变量,通过rigister声明。

字符串和字符串数组的区别

字符数组就是存储字符的数组字符串是用双引号括起来的字符序列,区别是字符串末尾由’/0’

指针和地址的联系

指针存储的内容是某个变量的地址而指针也是一个变量有本身的地址,

什么是形参什么是实参,如何使用

形参:定义函数时,函数括号中的变量

实参:调用函数时,函数括号内的参数

形参和实参的功能是进行数据传送:发生函数调用时,主函数把实参的值传送给调用的形参,从而实现主函数向被调函数的数据传送。

请问主函数对被调函数的声明的目的是什么

使系统知道被调用函数返回值的类型,以便在主函数按此类型进行处理。

什么是递归函数,递归算法的特点

在调用一个函数的过程中直接或间接地调用该函数本身,就是将一个复杂地问题分解成简单地小问题,一直分解到可以解决。

特点

要找到一个可以循环调用的递归表达式

要有终止条件,不然会无限循环

构成c语言地基本单位是什么,由那几部分组成

函数是构成c语言程序地基本单位,一个完成的c程序包含宏定义,函数声明,变量和一个或若干个函数构成

简述结构体类型于基本类型的区别

结构体类型是构造出来的数据类型,基本数据类型不需要构造

结构体类型可以包含不同数据类型,而基本类型只能包含一种数据类型

数据类型有哪些

基本数据类型:

整形 int(4) short int(2) long int(8)

字符型 char(1)

浮点型 float(8) double(16)

构造数据类型:数组,结构体,共用体

指针数据类型

空类型

枚举型

数组和指针的区别

指针是动态分配空间,通过malloc在堆上分配所需要的空间,使用完后调用free来释放分配空间,数组是静态分配空间,在全局变量或者栈

指针通过地址间接访问,数组直接访问数据,指针访问效率低,数组访问效率高

指针使用不当会造成内存泄漏,数组使用不当会造成数组越界

指针指向一块内存区域,数组对应一块内存区域

C语言中指针的好处

使用指向不同区域的指针可以轻易的共享数据,使程序操作更加快捷

可以构造数据结构

结构体和数组的区别

数组只可以存放相同类型的数据,结构体可以存放不同类型的变量。

结构体和共用体的区别

结构体每个变量都有自己的存储空间,共用体中的变量把他们当中内存最大的变量当作共用体的存储空间

队列和栈有什么区别

规则不同:队列先进先出 栈先进后出

操作不同,队列只能在表的一端进行插入,另一端进行删除 栈只能在表的一端插入删除

数组和链表的区别?

数组在内存中连续,长度固定,不能增长删减数组

链表是动态内存分配,内存不连续,支持动态增加长度 使用完后可以申请内存释放

C语言中动态内存,静态内存以及全局变量的概念

静态内存:程序编译时自动分配的存储区域

动态内存:程序员手动申请的存储区域,使用完后手动释放

什么是堆?什么是栈?

堆是一种数据结构,堆控制堆空间,堆空间的内存是程序运行时申请的动态内存,

又名堆栈是操作系统为建立某个进程或线程创建的存储区域在编译时可以指定栈的大小

栈是一种运算受限的线性表,仅运行在表的一端进行插入和删除运算,这一端被称为栈顶,相对的另一端被称为栈底

五大内存区的作用域

栈区主要用于函数调用的使用

堆区主要用于内存动态申请和归还

静态存储区用于保存全局变量和静态变量

常量区存放的是常量,不允许修改

代码区用于存储函数体的二进制代码

全局变量和局部变量的区别能否重名

作用域不同:全局变量的作用域是整个程序,而局部变量的作用域为当前函数或循环

内存存储方式不同:全局变量存储在静态区 局部变量存储在栈

生命周期不同:全局变量生命周期和主程序一样,局部变量随函数或者循环结束而销毁

使用方式不同:全局变量在声明后程序的各个文件都可以用到,但局部变量只能局部使用

可以重名,局部变量会屏蔽全局变量

计算机网络的五层协议

应用层

传输层

网络层

数据链路层

物理层

运输层的协议 udp和tcp/ip及他们的区别

UDP无连接,TCP面向连接

UDP不可靠传输不使用流量控制和拥塞控制 TCP可靠传输,使用流量控制和拥塞控制

UDP支持一对一一对多多对一多对对交互通信 TCP只能一对一通信

UDP面向报文传输, TCP面向字节流