C语言复试问题总结

复试C语言

C语言程序的组成部分:

C语言程序也叫文件,或者源程序文件,它由许多模块或者叫子程序组成,然后每一个模块又由许多函数组成,其中函数是组成程序的最小单位,包括一个主函数,还有若干个子函数。

 

评价算法的好坏:

1.确定性
2.可读性
3.健壮性
4.时间复杂度,空间复杂度

 

C语言的优缺点

1.优点:
(1)编写程序可读性强,编译效率比较高
(2)有丰富的运算符,表达灵活高效
(3)C语言是一种结构化的程序设计语言,特别适合大型程序的模块化设计
(4)语法性质不太严格,程序设计自由度大
(5)允许直接访问物理地址,可以进行位操作,能够实现汇编语言大部分功能,可直接对硬件进行操作
(6)有较高的可移植性
2.缺点:
(1)语法性质不严格,程序设计自由度大,就导致程序员需要对设计更加熟悉
(2)运算符比较丰富,这也增加了它的学习难度,运算符优先级不容易记忆
(3)C语言存在着一些不该存在的语法性质,内容冗余
(4)C语言许多运算符被重载,有不同的意义,甚至于一些关键字也有好几种意义

 

printf()函数返回值问题
如果成功,则返回输出数字的字符数目,如果错误,返回一个负数

 

void关键字的用途
第一种是修饰函数返回值,如果该函数没有范围值,可以定义为void类型,第二种是修饰函数的参数时,如果该函数没有参数,可直接声明为void类型。

 

全局变量与局部变量(按照变量的作用域来划分)
全局变量:变量定义在函数之外,可以为本文件中其他函数所共有,存储在静态存储区(数据库)中。程序开始执行时分配存储区,程序执行完毕之后释放这片空间,全局变量始终占据着固定的存储单元。
局部变量:定义在函数内部的变量,它存储在动态存储区(堆栈区),动态分配存储空间,在函数调用结束时,会释放这些存储空间。

 

写出在c程序文件的操作步骤?

基本步骤就是打开文件,读写文件,然后关闭文件。

 

字符常量与字符串常量有什么区别?

字符常量就是一个字符,用单引号括起来,仅仅占用一个字节;但是字符串常量是由若干个字符组成,用双引号括起来,存储的时候,自动会在后面加’\0’,即使同样是一个字符,字符串常量后面也还要加一个’\0’

 

什么是算法,算法有哪些特性?

算法就是程序用来解决实际问题,是按照指定的次序执行一系列操作的结果,按照次序执行操作的这个过程描述,我们叫做算法。
算法具有有穷性、确定性、有效性、有0个或者多个输入、有一个或者多个输出,这五个特性。

 

描述算法有哪些方法,它们各有什么优缺点?

1.自然语言:自然语言通俗易懂,但是它具有一定的歧义性。
2.伪代码:伪代码方便实用,但是没有流程图明晰,容易产生逻辑错误。
3.流程图:流程图虽然简单明了,但是绘制和修改时非常繁琐。
4.计算机语言:计算机语言表示算法严谨,但是无法做到算法设计的第一步就使用自然语言,难以理解。

 

简述数组越界将会产生什么后果?

数组越界有可能把数据放到已经存储了重要数据的内存单元,这样的话会改写本来不允许改写的数据,比如系统文件。
严重的话会导致系统运行紊乱甚至会崩溃。
但是如果这个数据不太重要,那么数组越界所产生的的后果也就不会那么明显,甚至于没有影响。
补充一点,用指针访问数组的时候,我们要注意判断,指针的指向是否已经超过数组下标的最大值

 

请简述一下值传递与地址传递?

首先是值传递过程,被调函数的形参作为被调函数的局部变量来处理,也就是说在内存的堆栈中会开辟存储空间,用来存储通过主调函数放进来的实参的值,从而成为了实参的一个拷贝。值传递的特点是被调函数对于形参的任何操作都是作为局部变量进行的,并不会影响主调函数的实参变量的值
其次是地址传递,在地址传递过程中,虽然被调函数的形参也作为局部变量放在堆栈区,但这时,存放的是由主调函数放进来的实参的地址,被调函数对于形参的任何操作,都被处理成间接寻址,通过堆栈存放的地址访问主调函数中实参变量,也正因为如此,被调函数对于形参做的任何操作都会影响主调函数中的实参变量。

 

请简述一下C语言的数据类型?

数据类型包括
1.基本类型
(1)整形
(2)字符型
(3)浮点型:浮点型包括单精度(float)和双精度(double)
2.构造类型
(1)数组类型
(2)结构体类型
(3)联合体类型
(4)枚举类型
3.指针类型
4.空类型

 

请简述一下循环结构中while与do while的区别?

对于do while循环,它要先执行一次循环体,然后进行判断,在循环过程中,至少执行一次循环体。
对于while循环,需要先进行判断,然后再执行循环,如果条件不成立,那么一次循环也不会执行。

 

C语言中常量、局部变量、全局变量、静态局部变量、静态全局变量分别存储在哪里?

常量:存储在常量区
局部变量:存储在栈区
全局变量:存储在静态区(或者叫做全局区)的常量区
静态局部变量:静态区(全局区)
静态全局变量:静态区(全局区)

 

请简述全局变量与静态全局变量的区别?

作用域
全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量,在各个源文件中都是有效的。
静态全局变量则限制了其作用域,也就是说只在定义该变量的源文件之内有效,在同一源程序的其它源文件中不可使用,由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数所共有,因此可以避免在其它源文件之中引起错误。
初始化
静态全局变量只初始化一次,防止在其它文件单元中被引用。
补充一点:静态局部变量与普通局部变量的区别在于静态局部变量只被初始化一次,下一次依据的是上一次的结果值。

 

C语言中存储类型有哪些?请简要叙述?

存储类型有auto,extern,register,static 四种类型
auto类型用来标识局部变量的存储类型;
extern 类型用来声明当前文件中引用在当前项目中的其它文件中定义的全局变量
register 由内存调入CPU寄存器之后,就常驻在CPU的寄存器之中,因此访问register变量将会在很大程度上提高效率
static 无论是全局的还是局部的,都存储在全局区域,它的声明周期为整个周期。

 

什么是函数?函数有什么作用?

函数就是C语言中实现某种功能的模块,拥有较强的独立性,可以相互调用。
函数的主要作用是可以减少代码的复用率,减少代码的冗余,提高程序模块化组织化。

 

内部函数与外部函数的区别是什么?

如果一个函数只能被本文件中的其它函数调用,则称为内部函数,也称为静态函数,在定义内部函数时,函数名和函数类型前面会加static,作用域只局限于所在文件,除了内部函数之外,其余的函数都可以被其它文件中的函数调用,称之为外部函数。

 

谈谈关键字和标识符区别?

标识符用来标识源程序中的某个对象的名字,一个标识符由字母数字下划线组成。关键字可以定义变量,表达式,以及会对一些文件进行预处理,关键字已经被编辑系统本身使用,用户不可使用。

 

谈谈sizeof与strlen有什么区别?

strlen是一个函数,用来计算指定字符串长度,不包括结束字符。
sizeof是一个单目运算符,不是一个函数,与strlen不同,其参数可以是数组,指针,类型,对象,函数,他所求的为所占的内存空间,并不是实际长度。

 

关键字static的作用?

第一:用来修饰局部变量,static修饰局部变量改变了变量的声明周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束,本质上改变了变量的存储类型,将存储在栈区的局部变量给转移到了静态区。
第二:修饰全局变量,一个全局变量如果被static修饰,就会使得其只能在本源文件中使用,不能在其它源文件内使用,由于全局变量有外部连接属性,但是被static修饰之后,就成了内部连接属性。
第三:修饰函数,一个函数被static修饰,使得这个函数只能在本原文件中使用,不能在其它原文件中使用,由于函数具有外部连接属性,一旦被static修饰之后,就成了内部连接属性。

 

函数的嵌套调用和递归调用有什么区别?

函数的嵌套调用允许在一个函数中调用另外的一个函数,递归调用是调用本身的函数。
函数的嵌套就是函数调用函数,这是普遍的。
递归就是函数调用自身,是函数嵌套的一个特例。

 

请简述内存分配的三种方式?

从静态存储区域分配。内存在程序编译的时候已经分配好,这块内存在程序的运行期间都存在,例如全局变量static
在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动会被释放。栈内存分配运算内置于处理器的指令集合中,效率很高,但是分配的内存容量有限。
从堆上分配,亦称为动态内存分配。程序在运行的时候用malloc或者new申请任意大小的内存,程序员自己负责在何时用free或者delete释放内存,动态存储内存的生存期由程序员决定,使用起来非常灵活,但是如果在堆上分配了空间,就有责任回收它。

 

请简述堆和栈的概念和区别?

栈由编译器自动分配释放,存放函数参数值,局部变量的值等等,堆一般由程序员分配释放,如果程序员不释放,那么程序结束时可能会由操作系统回收。
栈内存存储的是局部变量,但是堆内存存储的是实体,栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短,栈内存存放的变量生命周期一旦结束就会被释放。而堆内存的实体会被垃圾回收机制不定时的回收。

 

结构体类型和前面所学过的基本数据类型有什么区别?

结构体是一个可以包含不同数据类型的一个结构,是一种可以自己定义的数据类型。
特点:
1.结构体可以在一个结构体中声明不同的数据类型;
2.相同的结构的结构体变量可以相互赋值,而数组不行,因为数组是单数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以作为左值进行运算,所以数组之间不能通过数组名相互复制,即使数据类型和大小完全相同。
3.节省内存空间
4.高效率。

 

一个源程序文件必须包含哪几个部分?

1.预处理命令:#include<stdio.h>等;
2.全局声明:在函数之外进行的数据声明;
3.函数定义:每个函数用来实现一定的功能;

 

请说明程序设计的任务和工作阶段;

程序设计包括从确定任务,到得到结果,写出文档的全过程;
1.问题分析:建立模型;
2.设计算法:设计解题方法和具体步骤;
3.编写程序;
4.对源程序进行编辑(.c文件),编译(.obj文件),连接(.exe文件)得到可执行程序;
5.运行程序然后分析结果;
6.编写程序文档。

请简述指针数组与数组指针的区别?

指针数组:指针数组我们也可以说是“指针的数组”,首先它是一个数组,其次指针修饰这个数组,也就是说这个数组的所有元素都是指针类型, eg:int *p[10];
数组指针:数组指针我们也可以说成是“数组的指针”,首先这个变量是一个指针,其次数组用来修饰指针,也就是说指针存放着一个数组的首地址,或者说这个指针指向数组的首地址。
  • 5
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旺旺的碎冰冰~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值