为考研准备整理,参考网络资料课本资料,主要是c的简答开放题目有用的话可以点个赞,可以看着目录尝试自己回答后在进行往下看
目录
特点
c 语言的主要用途:
c语言为什么要规定,对所有使用的变量要“先定义,后使用”?
为什么使用符号常量
写出一个程序的组成
内存分配方式有三种:
c语言中变量的存储类别
strlen与sizeof的区别:
C 语言以函数为程序的基本单位,有什么好处?
关键字和一般标识符有什么不同?
循环相关
字符数组与字符串是否相同?若不相同,有何区别?
函数的嵌套调用与递归调用有什么区别?
结构体类型与我们前面学过的基本类型有哪些区别?
指针与地址有什么联系?在使用指针的过程中应注意哪些细节?指针类型对于程序设计有哪些意义?
指针和引用
描述一下gcc的编译过程?
c的执行过程
变量的声明与定义有什么区别
C语言中进行函数声明的作用是什么?
简述C语言的隐式类型转换发生的四种情况。
&&和&、||和|有什么区别?
typedef 和 define 有什么区别
请说出const与#define 相比,有何优点?
#include 与 #include “file.h”的区别?
用两个栈实现一个队列的功能?要求给出算法和思路!
简洁紧凑、灵活方便;运算符丰富;数据结构丰富
C是结构式语言;C语法限制不太严格、程序设计自由度大
C语言允许直接访问物理地址,可以直接对硬件进行操作;C语言程序生成代码质量高,程序执行效率高
C语言适用范围大,可移植性好;具有预处理功能;具有递归功能
c语言具有绘图能力和强大的数据处理能力,它是数值计算的高级语言
C语言可以用来开发许多系统软件和大型应用软件。如UNIX,LINUX等操作系统。 在软件需要对硬件进行操作的场合,用C语言明显优于其它高级语言。例如,各种硬件设备的驱动程序(象显卡驱动程序、打印机驱动程序等)一般都是用C语言编写的。 在图形、图像及动画处理方面,C语言具有绝对优势,特别是游戏软件的开发主要就是使用C语言。 随着计算机网络飞速发展,特别是Internet的出现,计算机通信就显得尤其重要,而通信程序的编制首选就是C语言。 C语言适用于多种操作系统,象WINDOWS、UNIX、LINUX等绝大多数操作系统都支持C语言,其它高级语言未必能得到支持,所以在某个特定操作系统下运行的软件用C语言编制是最佳选择。
程序中使用的各种变量都应预先加以说明,即先说明,后使用。对变量的说明可以包括三个方面:?数据类型?存储类型?作用域
数据类型决定数据所占内存字节数,数值取值范围,在其上可进行的操作。
对变量先定义后使用的目的是:
1)凡是未被事先定义的不做为变量名,这就能保证程序中变量名使用得正确,便于编译时发现错误,避免变量名使用时出错。
2)每个变量被指定一确定类型,在编译时就能为其分配相应的存储单元。
3)指定每一个变量属于一个类型,便于在编译时据此检查该变量所进行的运算是否合法。
1)简化书写格式、减少出错率。
2)定义符号常量可以提高程序的可读性,便于程序的调试和修改。
3)符号常量不同于变量,在其作用域内不能被改变和重新赋值。
4)习惯上人们把符号常量名用大写字母表示,变量用小写,以示区别
程序名、预编译指令、标准的输入输出、c语言的主函数、函数开始标志、定义变量、给变量赋值、输出结果、程序正常结束、函数结束标志
1、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
2、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
3、从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,频繁地分配和释放不同大小的堆空间将会产生堆内碎块
变量的存储类别为两大类,静态存储和动态存储 具体有自动auto,寄存器register和静态static和外部extern 局部缺省为auto变量
标识符作用域
全局变量 是在函数外定义的变量,作用域从定义它的位置到整个源文件结束为止, 生存期为整个程序运行期间。全局变量都是静态变量
局部变量有三种类型:自动auto,寄存器register和静态static。 自动变量随着函数的使用与否创建消失;寄存器变量分配在cpu中,没有内存地址; 静态变量占用固定存储单元,在程序执行过程不释放,直到程序运行结束
关键字static的作用是什么? 关键字static有三个明显的作用:
1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
C语言中,动态存储区主要存放哪些数据?
答:动态存储区中存放以下数据:
1) 函数的形参
2) 函数调用时的现场保护和地址等。
3) Auto register型局部变量
对以上数据,当进行函数调用时分配动态存储空间,当函数调用结束时,释放这些存储单元。在程序的执行过程中,这种分配和释放是动态的。
1、strlen计算字符串的具体长度(只能是字符串),不包括字符串结束符。返回的是字符个数。
2、sizeof计算声明后所占的内存数(字节大小),不是实际长度。
3、sizeof是一个取字节运算符,而strlen是个函数。
4、sizeof的返回值=字符个数*字符所占的字节数,字符实际长度小于定义的长度,此时字符个数就等于定义的长度。若未给出定义的大小,分类讨论,对于字符串数组,字符大 小等于实际的字符个数+1;对于整型数组,字符个数为实际的字符个数。字符串每个字符占1个字节,整型数据每个字符占的字节数需根据系统的位数类确定,32位占4个字节。
函数是程序的基本组成单位,可以用函数作为程序模块来实现c语言程序。利用函数不仅可以使程序模块化,而且可以使程序设计的简单和直观,提高程序的可读性和可维护性。还可以把程序中的一些计算编成通用函数,以供随时使用。
标识符用来标识源程序中的某个对象的名字,一个标识符由字母、数字和下划线组成。关键字可以定义变量、表达式语句功能和对一些文件进行预处理,关键字已被编译系统本身使用,所以用户编写程序时不能够使用这些关键字来作为标识符,如int,if,for等。
if语句中的条件表达式可以是任意的合法表达式吗?Switch语句中break的作用是什么?
可以是任意数值。在switch语句中,break语句可使流程立即跳出switch语句体不执行其他的case。
三种循环结构中的条件是循环进行的条件还是循环结束的条件?循环结构中break语句和continue语句的作用是什么,二者有何区别?
for语句、while语句:循环进行的条件;do-while语句:循环结束的条件;break可用于switch语句,表示跳出整个switch块,而continue则不能用于switch语句,它们都可用于循环语句的循环体,break用于立即退出当前循环,而continue仅跳过当次循环,本次循环体内不执行continue语句后的其他语句,但下次循环还会执行。
不相同,C语言中没有专门的字符串变量,如果要将一个字符串存放在变量中,必须使用字符数组,即用一个字符型数组来存放一个字符串,数组中每一个元素放一个字符。字符串必须以’\0’结尾,字符数组可以包含多个’\0’
函数嵌套允许在一个函数中调用另外一个函数,递归调用是调用本身的函数。函数嵌套就是函数调用函数,是普遍的,递归就是函数调用自身,是函数嵌套的一个特例。
结构体是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型。
特点:1、结构体可以在一个结构体中声明不同的数据类型;
2、相同的结构的结构体变量可以相互赋值,而数组不行,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以做为左值进行运算,所以数组之间就不能通过数组名称相互复制,即使数据类型和数组大小完全相同。
3、节省内存空间。4、高效率。
指针保存了某个变量的地址,指针本身是一个变量,它也有自身的地址,而指针的内容是某个变量的地址。
注意细节:要初始化、正确的传递地址方式、使用时要判断。指针可以用来有效地表示复杂的数据结构,可以用于函数参数传递并达到更加灵活使用函数的目的,使C语言程序设计具有灵活、实用、高效的特点。
1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 3) 不存在指向空值的引用,但是存在指向空值的指针。 指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作
gcc编译过程分为4个阶段:预处理、编译、汇编、链接。 预处理:头文件包含、宏替换、条件编译、删除注释 编译:主要进行词法、语句、语义分析等,检查无误后将预处理好的文件编译成汇编文件。 汇编:将汇编文件转换成二进制目标文件 链接:将项目中的各个二进制文件+所需的库+启动代码链接成可执行文件。
(1) file.c是源文件,通过编辑得到; (2) file.obj 是目标文件,即计算机能够处理的由二进制指令组成的文件,通过对源文件进行编译得到; (3) file.exe 是可执行文件,通过将目标文件与其他目标文件或库函数连接得到。
内存的最小存储单位以及内存的最小计量单位分别是?
内存的最小存储单位为二进制,内存的最小计量单位是字节
声明变量 不需要建立存储空间,变量的定义需要建立存储空间。为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明,但是只在一个地方定义。加入 extern 修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。
说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间,如外部变量。
答:函数声明的作用是:把函数的名字、函数类型及形参类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照和检查(例如,函数名是否正确,实参的类型和个数是否一致)。
- 算术运算式中,低类型能转换为高类型。
- 赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给它。
- 函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。
- 函数有返回值的时候,系统隐式的将返回表达式类型转换为返回值类型,赋给调用函数
1、&和|对操作数进行求值运算,&&和||只是判断逻辑关系。 2、&&和||在在判断左侧操作数就能确定结果的情况下就不再对右侧操作数求值。
1、用法不同:typedef 用来定义一种数据类型的别名,增强程序的可读性。define 主要用来定义常量,以及书写复杂使用频繁的宏。 2、执行时间不同:typedef 是编译过程的一部分,有类型检查的功能。define 是宏定义,是预编译的部分,其发生在编译之前,只是简单的进行字符串的替换,不进行类型的检查。 3、作用域不同:typedef 有作用域限定。define 不受作用域约束,只要是在 define 声明后的引用都是正确的。 4、对指针的操作不同:typedef 和 define 定义的指针时有很大的区别。 5、typedef 定义是语句,因为句尾要加上分号。而 define 不是语句,千万不能在句尾加分号。
答:Const作用:定义常量、修饰函数参数、修饰函数返回值三个作用。被Const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。 2) 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试
答:前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h。
答 、设2个栈为A,B, 一开始均为空. 入队: 将新元素push入栈A; 出队: (1)判断栈B是否为空; (2)如果不为空,则将栈A中所有元素依次pop出并push到栈B; (3)将栈B的栈顶元素pop出; 这样实现的队列入队和出队的平摊复杂度都还是O(1), 比上面的几种方法要好