计算机考研复试C语言最强简单题资料

计算机考研复试C语言最强简答题资料

  1. 什么是C语言?
    C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括一些类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。
  2. 面向对象和面向过程有什么区别?
    面向对象是以数据为中心,而面向过程以功能为中心。面向过程就是分析出解决问题所需要的步骤,然后用函数把这些问题一步一步的实现,然后再使用的时候依次调用就可以了。面向对象就是把构成问题的事物分解成各个对象,构建对象的目的不是来完成一个步骤的,而是为了描述某个事物在解决整个问题的步骤中的行为。
  3. 头文件的作用?
    一、通过头文件来调用库功能。源代码不便向用户公布时,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的,编译器会从库中提取相应的代码。二、头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。
  4. 简述C程序的结构特点?
    C程序为函数模块结构,每个C程序都是由一个或者多个函数组成,其中至少有一个main()函数。程序从main()函数开始执行,程序在执行中可以调用由系统提供的库函数和用户自定义的函数。
  5. C语言具有哪些特点?
    C语言是一种兼有高级语言和汇编语言优点的语言;C语言是一种结构化程序设计语言;C语言有数据类型丰富的运算符;C语言有预处理功能;
  6. 从C语言执行效率方面,简述C语言采取了哪些措施提高效率?
    ① 使⽤指针② 使⽤宏函数:宏函数仅仅作为预先写好的代码嵌⼊到当前程序,不会产生函数调⽤,所以仅仅是占⽤了空间,而使程序可以高效运行。在频繁调⽤同⼀个宏函数的时候,该现象尤其突出。函数和宏函数的区别就在于,宏函数占用了大量的空间,而函数占用了时间。③ 使⽤位操作:位操作可以减少除法和取模的运算。④ 长内短外嵌套循环:循环嵌套中将较长循环设为内置循环,较短循环设为外置循环,以减少CPU跨切循环层的次数,提高程序的运行效率。⑤ 使用汇编指令:将汇编指令嵌⼊到C语言程序中,汇编语言是效率最高的计算机语言,因此为了获得程序的高效率。⑥ 调用系统API :在C语言程序中可以调⽤系统API,接近底层,从而提高程序的运行效率。⑦ 条件编译 :⼀般情况下,C语言源程序中的每⼀行代码都要参加编译,但有时候出于对程序代码优化的考虑,希望只对其中⼀部分内容进行编译。此时就需要在程序中加上条件,让编译器只对满足条件的代码进行编译,将不满足条件的代码舍弃,这就是条件编译。⑧使用寄存器变量。⑨不检查数组下标。
  7. C语言的主要用途是什么?
    作为一种系统程序设计语言,C语言已经广泛用于编写有关的系统软件,如操作系统、编译系统等;作为一种应用程序设计语言,C已广泛用于编写各种应用软件,如数据库管理软件、CAD/CAM软件、文字处理软件、图形软件等。
  8. C语言中十进制、八进制、十六进制整型常量是如何表示的?
    十进制直接表示。以数字0开头的数是八进制数。十六进制整数:以0x开头的数是十六进制数。
  9. C程序开发的一般步骤?
    C程序的运行一般要经历四个步骤。即源程序的编辑、源程序的编译、目标程序的链接和可执行程序的运行。
  10. C语言中规定对所用到的变量进行先定义后使用,这样有什么好处?
    编译系统会根据定义为变量分配内存空间,分配内存空间的大小与数据类型有关。系统可以根据变量的类型检查对该变量的运算是否合法,这样就给程序员调试程序带来方便,便于纠错检查。
  11. 什么是预编译?何时需要预编译?
    预编译又称为预处理,是做些代码文本的替换工作。c语言提供的预处理功能主要有以下三种:1)宏定义 2)文件包含 3)条件编译。
    1、总是使用不经常改动的大型代码体。 2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这两种情况下,可以进行预编译。
  12. .C语言中有哪些数据类型?基本数据类型包括哪些?为什么存在这么多种基本数据类型?
    C语言数据类型有基本类型、枚举类型、void类型、派生类型、指针类型、数组类型、结构类型、联合类型。
    函数类型其中基本类型包括:整型、字符型、实型(浮点型)。数据类型多是为了便于提高空间利用率,找到适合的数据类型使用,为了更加丰富的表达生活中的各种值。
  13. 局部变量和全局变量的区别?分别是怎么实现的?操作系统和编译器是怎么知道的?
    全局变量的生命周期是整个程序运行的时间,而局部变量的生命周期则是局部函数或过程调用的时间段。全局变量的作用域为“整个工程”,局部变量作用域则为从定义的位置开始,到定义它的右花括号结束,只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。全局变量存储在全局区,而局部变量存储在栈区。
    他们的实现是由编译器在编译时采用不同内存分配方法。
    全局变量在main函数调用后,就开始分配空间,(静态变量则是在main函数前就已经初始化了)。局部变量则是在用户栈中动态分配空间。
  14. 常量分为哪些?
    整型常量、实型常量和字符型常量和字符串常量,定义常量,符号常量等。
    15.如何不使用第三个变量,将两个变量的值交换?
    采用位运算的异或。
  15. C语言中存储类型有哪些?简要描述。
    c语言中的存储类型有auto, extern, register, static 这四种。auto只能用来标识局部变量的存储类型;extern用来声明在当前文件中引用在当前项目中的其它文件中定义的全局变量;声明为register的变量在由内存调入到CPU寄存器后,则常驻在CPU的寄存器中,因此访问register变量将在很大程度上提高效率,因为省去了变量由内存调入到寄存器过程中的好几个指令周期;被声明为静态类型的变量,无论是全局的还是局部的,都存储在全局区中,其生命周期为整个程序。
  16. 字符常量与字符串常量有什么区别?
    字符常量和字符串常量的表示方法不同,字符常量是用单引号括起来的一个字符,字符串常量是用一对双引号括起来的0个或者多个字符组成的序列。最主要的区别是存储的不同:字符型数据在存储时,并不是把该字符本身放到内存单元中,而是把该字符的相应ASCII码值存放到该存储单元中;而字符串常量是将字符存储,并自动在其末尾加上‘/0’作为字符串结束的标志,所以字符串常量在内存中所占用的字节数为字符串长度+1。
  17. 关键字const有什么作用?
    定义const常量,只具有可读性,防止被修改,增加程序健壮性,便于类型检查,节省时间提高效率。
  18. 关键字volatile有什么含义,试举例?
    一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
    1). 并行设备的硬件寄存器(如:状态寄存器)
    2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
    3). 多线程应用中被几个任务共享的变量
  19. 为什么使用符号常量?
    1)简化书写格式、减少出错率。
    2)定义符号常量可以提高程序的可读性,便于程序的调试和修改。
    3)符号常量不同于变量,在其作用域内不能被改变和重新赋值。
    4)习惯上人们把符号常量名用大写字母表示,变量用小写,以示区别。
  20. 什么是函数?有什么作用?
    函数就是 C 语言中实现某种功能的模块,有较强的独立性,可以相互调用。
    提高代码的复用率,减少代码冗余,提高程序模块化组织性。
  21. 什么是库函数?有哪些库函数?
    c语言标准规定的库函数或者编译器特定的库函数。数学函数、输入输出函数、字符串函数、字符处理函数等。
  22. Void关键字的用途?
    void是空类型, void的作用在于:
    (1) 对函数返回的限定。(2) 对函数参数的限定。
  23. C语言以函数为程序的基本单位,有什么好处?
    函数是程序的基本组成单位,利用函数不仅可以使程序模块化,而且可以使程序设计的简单和直观,提高程序的可读性和可维护性。
  24. 局部变量和全局变量能否重名?
    能,局部会屏蔽全局。要用全局变量,需要使用"::"。
  25. 如何引用一个已经定义过的全局变量?
    可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变量,假定你将那个变量写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
  26. 全局变量可不可以定义在被多个.c文件包含的头文件中?为什么?
    可以,在不同的C文件中以static形式来声明同名全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。
  27. 函数的实参和形参有什么区别?
    形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。
    实际参数变量可以是常量、变量、表达式、函数等,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。函数调用过程是单向的,形参的改变不会影响到实参。
  28. 函数是如何进行声明和定义的?
    函数声明就是让编译器知道该函数,但具体是否存在不重要,函数声明要在函数使用之前,一般放在头文件中。
    函数的定义就是指函数的具体实现方式,交代清楚函数的功能,其格式包括返回值类型、函数名、参数。
  29. 内部函数与外部函数的区别?
    如果一个函数只能被本文件中的其他函数调用,则成为内部函数,也成为静态函数,在定义内部函数时,函数名和函数类型前加static,作用域只局限于所在文件。除内部函数外,其余的函数都可以被其他文件中的函数调用,为外部函数。
  30. 函数声明的作用?
    函数声明的作用是:把函数的名字、函数类型及形参类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照和检查。
  31. 描述一下strcmp(a,b)函数?
    比较函数。a>b返回正数,a=b返回0,a<b返回负数。
  32. 操作符有哪些?
    算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、逻辑操作符、条件操作符、逗号表达式、下标引用、函数调用、结构成员等。
  33. 关键字和一般标识符有什么区别?
    标识符用来标识源程序中的某个对象的名字,一个标识符由字母、数字和下划线组成。关键字可以定义变量、表达式语句功能和对一些文件进行预处理,关键字已被编译系统本身使用,所以用户编写程序时不能够使用这些关键字来作为标识符,如int,if,for等。
  34. 谈谈对左移操作符和右移操作符的理解?
    左移操作符:二进制位左移,右端补0;
    右移操作符:算术右移:二进制位右移,左端补原符号位;
    逻辑右移:二进制位右移,左端补0;
  35. goto语句怎么使用?
  36. 简述default子句?
  37. Const与#define相比,有什么优点?
    Const作用:定义常量、修饰函数参数、修饰函数返回值三个作用。被Const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。 2) 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试
  38. 逻辑与与按位与有什么区别?逻辑或与按位或有什么区别?
    &和|对操作数进行求值运算,&&和||只是判断逻辑关系。 2、&&和||在在判断左侧操作数就能确定结果的情况下就不再对右侧操作数求值。
  39. 请简述C语言的隐式类型转换发生的四种情况,并说明每种情况如何转换。
    算术运算式中,低类型能转换为高类型。
    赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给它。
    函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。
    函数有返回值的时候,系统隐式的将返回表达式类型转换为返回值类型,赋给调用函数。
  40. Sizeof和strlen有什么区别?
    strlen 是一个函数,它用来计算指定字符串的长度,但不包括结束字符。
    关键字 sizeof 是一个单目运算符,而不是一个函数。与函数 strlen 不同,它的参数可以是数组、指针、类型、对象、函数等,他所求的为所占内存空间,而不是实际长度。
  41. 关键字typedef和#define有什么区别?
    1、用法不同:typedef 用来定义一种数据类型的别名,增强程序的可读性。define 主要用来定义常量,以及书写复杂使用频繁的宏。 2、执行时间不同:typedef 是编译过程的一部分,有类型检查的功能。define 是宏定义,是预编译的部分,其发生在编译之前,只是简单的进行字符串的替换,不进行类型的检查。 3、作用域不同:typedef 有作用域限定。define 不受作用域约束,只要是在 define 声明后的引用都是正确的。 4、对指针的操作不同:typedef 和 define 定义的指针时有很大的区别。 5、typedef 定义是语句,因为句尾要加上分号。而 define 不是语句,千万不能在句尾加分号。
  42. 关键子static有什么作用?
    第一:修饰局部变量,static修饰局部变量改变了变量的生命周期让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。本质上改变了变量的存储类型,将存储在栈区的局部变量转移到静态区。
    第二:修饰全局变量,一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。因为全局变量具有外部链接属性,但被static修饰以后,就变成了内部链接属性。
    第三:修饰函数,一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。因为函数具有外部链接属性,但被static修饰以后,就变成了内部链接属性。
  43. C语言结构化程序由哪几部分组成?/结构化算法有哪几种机构?试分别描述
    顺序结构:语句从上到下依次执行。
    分支结构:在执行程序时候,有一个判断语句,若判断成功则向一个分支方向执行,不然,向另外一个分支方向执行。
    循环结构:有一个判断语句,如果符合这个范围,则循环执行,直到不满足条件,break跳出循环。
  44. C语言中的语句有几类?其中控制语句有哪些?
    控制语句(完成一定的控制功能);函数调用语句;表达式语句;空语句;复合语句;
    控制语句有(1)if else(条件语句)、for()(转向语句)、while()(循环语句)、
    do while()(循环语句)、continue(结束本次循环语句)、break(中止执行switch或循环语句)、switch(多分支选择语句)、goto(转向语句)、return(从函数返回语句)。
  45. 函数的嵌套调用和递归调用有什么区别?
    函数嵌套允许在一个函数中调用另外一个函数,递归调用是调用本身的函数。函数嵌套就是函数调用函数,是普遍的,递归就是函数调用自身,是函数嵌套的一个特例。
  46. 传值调用和传址调用的区别?
  47. 字符串和字符数组是否相同?有何不同?
    不相同,C语言中没有专门的字符串变量,如果要将一个字符串存放在变量中,必须使用字符数组,即用一个字符型数组来存放一个字符串,数组中每一个元素放一个字符。字符串必须以’\0’结尾,字符数组可以包含多个’\0’。
  48. C语言中指针和数组的区别?
  49. 指针数组和数组指针的区别?
  50. 指针函数和函数指针的区别?
  51. 什么是野指针?成因是什么?
  52. 如何规避野指针?
  53. 数组越界有什么后果?
    越界访问有可能把数据放到已经存储了重要数据的内存单元,也就是改写了本来不许改写的数据。重则崩溃:如果这个数据是系统的重要内容,有可能导致系统运行紊乱甚⾄是崩溃。轻则影响不大:当然如果这个数据并不重要,那么越界访问的后果就不明显或者是没有影响。避免的办法是对数组的下标严格检测,判断数组下标是否越界。⽤指针访问数组时要注意判断指针的指向是否已超过数组下标的最⼤值。
  54. 指针和地址有什么联系?在使用指针的过程中应注意哪些细节?指针类型对于程序设计有哪些意义?
    指针保存了某个变量的地址,指针本身是一个变量,它也有自身的地址,而指针的内容是某个变量的地址。
    注意细节:要初始化、正确的传递地址方式、使用时要判断。
    指针可以用来有效地表示复杂的数据结构,可以用于函数参数传递并达到更加灵活使用函数的目的,使C语言程序设计具有灵活、实用、高效的特点。
  55. 引用与指针的区别?
    引用必须被初始化,引用初始化以后不能被改变,指针不需要初始化。指针可以改变所指的对象,不存在指向空值的引用,但是存在指向空值的指针。
  56. 值传递和地址传递的区别?
    值传递过程中,被调函数的形参作为被调函数的局部变量处理,即在内存的堆栈中开辟空间以存放由主调函数放进来的实参的值,从而成为了实参的⼀个拷贝。值传递的特点是被调函数对形参的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。而在地址传递过程中,被调函数的形参虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
  57. 指针变量常用来做什么?
    指针变量常用来存放变量的地址,通过 *pa(解引用操作)来找到所指向对象,来操作对象。
  58. 字符指针、浮点数指针以及函数指针这三种类型的变量哪个占用的内存最大?为什么?
    一样大。指针变量只需要存储一段内存单元的首地址。指针变量的大小由机器位数决定,无论是哪种数据类型,都是用32/64位表示,所以占用内存一样大。
  59. 结构体与共同体的区别?
  60. 解释局部变量、全局变量和静态变量的含义?
  61. 结构体类型和前面学过的基本数据类型有什么区别?
    结构体是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型。
    特点:1、结构体可以在一个结构体中声明不同的数据类型;2、相同的结构的结构体变量可以相互赋值,而数组不行,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以做为左值进行运算,所以数组之间就不能通过数组名称相互复制,即使数据类型和数组大小完全相同。3、节省内存空间。4、高效率。
  62. 内存分配的三种方式?
    1、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。   
    2、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。   
    3、从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,频繁地分配和释放不同大小的堆空间将会产生堆内碎块。
  63. 什么是文件?C语言中的文件如何分类?
    文件:是指存储在外部介质上一组相关数据的集合。
    分类:根据文件的组织形式,文件可以分为ASCII文件和二进制文件。
  64. 堆和栈的概念和区别?
    栈由编译器自动分配释放 ,存放函数参数值,局部变量的值等。堆一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
    栈内存存储的是局部变量而堆内存存储的是实体;栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。
  65. 什么是算法?算法有哪些特性?
    算法:程序按指定的次序执行一系列操作解决问题的过程描述称为算法。
    算法的特性:(1)有穷性;(2)确定性;(3)有零个或多个输入;(4)有一个或多个输出;(5)有效性。
  66. 类与结构体有什么区别?
    (1)结构体存储在栈中,类的实例化可以存储在栈中,也可以存储在堆中;(2)结构体的执行效率比类要高;(3)结构体没有析构函数,类有析构函数;(4)结构体不可以继承,类可以继承。
  67. 堆栈溢出一般是由什么原因导致的?
    1.没有回收垃圾资源。2.层次太深的递归调用。

猜你喜欢

转载自blog.csdn.net/weixin_51636172/article/details/124022262