C语⾔简答题汇总
C语⾔简答汇总
根据⽹上常见的⼀些⾯试题整理,⽤于考研复试备考,⼤部分是C语⾔问答,但不仅仅限于C语⾔问答,也包括计⽹和操作系统相关的⼀些问答,内容如有错误,欢迎指正
1、c语⾔的特点以及C语⾔与Python的⽐较?
c语⾔的数据类型丰富,具有现代语⾔的各种数据结构,能实现复杂的运算。c语⾔使,⽤灵活⽅便,便于实现程序的结构化,节省内存。C语⾔与Python的⽐较:
(1)⾸先Python的使⽤要更加简单灵活,要实现相同的功能,Python的代码量通常只有C语⾔的30%
(2)C语⾔是⾯向过程的语⾔,很多时候需要⾃⼰⼿动实现函数来完成⼀些功能,Python中引⼊了类和对象,是⾯向对象编程的语⾔。(3)Python拥有许多优秀的第三⽅库,在编程的时候更加的简单。
(4)c语⾔的数据类型丰富,Python的数据类型只有数字、字符串、列表、元组、集合、字典6种,不需要事先定义变量类型,使⽤更加简便。
2、c语⾔为什么要规定,对所有使⽤的变量要“先定义,后使⽤”?
凡是未被事先定义的变量,在使⽤过程中不会被当作变量名,这样能够保证程序中的变量名使⽤正确。每⼀个变量被指定⼀个确定的数据类型,在编译时就能为其分配相应的存储单元。指定⼀个变量属于⼀个类型,在编译的时候就能检查该变量是否使⽤正确。通俗来讲,给变量⼀个存储位置,⽅便操作。
3、根据⾃⼰的认识,写出c语⾔的特点
语⾔简洁,使⽤灵活⽅便,具有丰富的运算符和数据类型,便于实现程序的结构化,⽤c语⾔编写的程序可移植性好,c语⾔可以作为系统设计语⾔、应⽤程序设计语⾔,c语⾔具有绘图能⼒和强⼤的数据处理能⼒,它是数值计算的⾼级语⾔
4、c 语⾔的主要⽤途:
c语⾔主要⽤于程序的编程开发,和其他的⾼级语⾔相⽐,都采⽤符号形式,提供许多⾼级的程序结构,供编写⼈员组织复杂的程序。都是⾯向问题的语⾔,独⽴于具体的机器,⽐较接近⼈的语⾔习惯,能更有效的描述各种算法。c语⾔具有绘图能⼒和可移植性,有更强的数据处理能⼒,适⽤于编写系统软件、⼆维、三维图形和动画。
5、写出⼀个程序的组成
程序名、预编译指令、标准的输⼊输出、c语⾔的主函数、函数开始标志、定义变量、给变量赋值、输出结果、程序正常结束、函数结束标志
6、C 语⾔以函数为程序的基本单位,有什么好处?
函数是程序的基本组成单位,可以⽤函数作为程序模块来实现c语⾔程序。利⽤函数不仅可以使程序模块化,⽽且可以使程序设计的简单和直观,提⾼程序的可读性和可维护性。还可以把程序中的⼀些计算编成通⽤函数,以供随时使⽤。
7、关键字和⼀般标识符有什么不同?
标识符⽤来标识源程序中的某个对象的名字,⼀个标识符由字母、数字和下划线组成。关键字可以定义变量、表达式语句功能和对⼀些⽂件进⾏预处理,关键字已被编译系统本⾝使⽤,所以⽤户编写程序时不能够使⽤这些关键字来作为标识符,如int,if,for等。
8、if语句中的条件表达式可以是任意的合法表达式吗?Switch语句中break的作⽤是什么?
可以是任意数值。在switch语句中,break语句可使流程⽴即跳出switch语句体不执⾏其他的case。
9、三种循环结构中的条件是循环进⾏的条件还是循环结束的条件?循环结构中break语句和continue
语句的作⽤是什么,⼆者有何区别?for语句、while语句:循环进⾏的条件;do-while语句:循环结束的条件;break可⽤于switch语句,表⽰跳出整个switch块,⽽continue 则不能⽤于switch语句,它们都可⽤于循环语句的循环体,break⽤于⽴即退出当前循环,⽽continue仅跳过当次循环,本次循环体内不执⾏continue语句后的其他语句,但下次循环还会执⾏。
10、字符数组与字符串是否相同?若不相同,有何区别?
不相同,C语⾔中没有专门的字符串变量,如果要将⼀个字符串存放在变量中,必须使⽤字符数组,即⽤⼀个字符型数组来存放⼀个字符串,数组中每⼀个元素放⼀个字符。字符串必须以’\0’结尾,字符数组可以包含多个’\0’
11、函数的嵌套调⽤与递归调⽤有什么区别?
函数嵌套允许在⼀个函数中调⽤另外⼀个函数,递归调⽤是调⽤本⾝的函数。函数嵌套就是函数调⽤函数,是普遍的,递归就是函数调⽤⾃⾝,是函数嵌套的⼀个特例。
12、结构体类型与我们前⾯学过的基本类型有哪些区别?
结构体是⼀个可以包含不同数据类型的⼀个结构,它是⼀种可以⾃⼰定义的数据类型。特点:1、结构体可以在⼀个结构体中声明不同的数据类型;2、相同的结构的结构体变量可以相互赋值,⽽数组不⾏,
因为数组是单⼀数据类型的数据集合,它本⾝不是数据类型(⽽结构体是),数组名称是常量指针,所以不可以做为左值进⾏运算,所以数组之间就不能通过数组名称相互复制,即使数据类型和数组⼤⼩完全相同。3、节省内存空间。第四、⾼效率。
13、指针与地址有什么联系?在使⽤指针的过程中应注意哪些细节?指针类型对于程序设计有哪些意义?
指针保存了某个变量的地址,指针本⾝是⼀个变量,它也有⾃⾝的地址,⽽指针的内容是某个变量的地址。注意细节:要初始化、正确的传递地址⽅式、使⽤时要判断。指针可以⽤来有效地表⽰复杂的数据结构,可以⽤于函数参数传递并达到更加灵活使⽤函数的⽬的,使C语⾔程序设计具有灵活、实⽤、⾼效的特点。
14、描述⼀下gcc的编译过程?
gcc编译过程分为4个阶段:预处理、编译、汇编、链接。
预处理:头⽂件包含、宏替换、条件编译、删除注释
编译:主要进⾏词法、语句、语义分析等,检查⽆误后将预处理好的⽂件编译成汇编⽂件。
汇编:将汇编⽂件转换成⼆进制⽬标⽂件
链接:将项⽬中的各个⼆进制⽂件+所需的库+启动代码链接成可执⾏⽂件。
15、内存的最⼩存储单位以及内存的最⼩计量单位分别是?
内存的最⼩存储单位为⼆进制,内存的最⼩计量单位是字节
16、#include<>与#include””的区别?
Include<>到指定的⽬录头⽂件,#Include””先到项⽬所在⽬录头⽂件,如果没有到再到系统指定的⽬录下寻
17、描述⼀下变量的命名规则?
变量名必须以字母或者下划线开始,其后为字母数字下划线
18、变量的声明与定义有什么区别
声明变量 不需要建⽴存储空间,变量的定义需要建⽴存储空间。为变量分配地址和存储空间的称为定义,不分配地址的称为声明。⼀个变量可以在多个地⽅声明,但是只在⼀个地⽅定义。加⼊ extern 修饰的是变量的声明,说明此变量将在⽂件以外或在⽂件后⾯部分定义。说明:很多时候⼀个变量,只是声明不分配内存空间,直到具体使⽤时才初始化,分配内存空间,如外部变量。
19、谈谈c语⾔中有符号和⽆符号的区别?
有符号:数据的最⾼位为符号位,0表⽰正数,1表⽰负数
⽆符号:数据的最⾼位不是符号位,⽽是数据的⼀部分
20、谈谈计算机中补码的意义?
统⼀了零的编码;将符号位与其他位统⼀处理将减法运算转换成加法运算
21、谈谈数组的特点?
同⼀个数组所有的成员都是相同的数据类型,同时所有的成员在内存中的地址是连续的
22、数组的分类?
数组的分类主要是:静态数组、动态数组两类。
静态数组:类似int arr[5];在程序运⾏就确定了数组的⼤⼩,运⾏过程不能更改数组的⼤⼩。
动态数组:主要是在堆区申请的空间,数组的⼤⼩是在程序运⾏过程中确定,可以更改的⼤⼩。
23、描述⼀下⼀维数组的不初始化、部分初始化、完全初始化的不同点
不初始化:如果是局部数组 数组元素的内容随机 如果是全局数组,数组的元素内容为0
部分初始化:未被初始化部分⾃动补0
完全初始化:如果⼀个数组完全初始化可以省略元素的个数 数组的⼤⼩由初始化的个数确定
24、谈谈数组名作为类型、作为地址、对数组名取地址的区别?
数组名作为类型:代表的是整个数组的⼤⼩
数组名作为地址:代表的是数组⾸元素的⼆地址
对数组名取地址:代表的是数组的⾸地址
25、谈谈你对⼆维数组在物理上以及逻辑上的数组维度理解?
⼆维数组在逻辑上是⼆维的,在物理上是⼀维的,按照先⾏后列原则存储
26、描述⼀下函数的定义与函数的声明之间的区别?
函数定义:是指对函数功能的确⽴、包括指定函数名、函数类型、形参及其类型、函数体等,它是⼀个完整的、独⽴的函数单位。
函数的声明:是把函数的名字、函数类型以及形参的个数、类型和顺序通知编译系统,以便在对包含函数调⽤的语句进⾏编译时,据此对其进⾏对照检查(例如函数名是否正确,实参与形参的类型和个数是否⼀致)
27、描述⼀下指针与指针变量的区别?
指针:指针是内存地址,指针变量是指针变量是⽤来存放内存地址的变量,不同类型的指针变量所占⽤的存储单元长度是相同的,但由于指针指向的地址存放的数据类型不同,内容所占的存储空间各有不同。
28、描述⼀下32位或64位平台下指针的⼤⼩?
32位平台:任意类型的指针⼤⼩为4字节
64位平台:任意类型的指针⼤⼩为8字节
29、描述⼀下指针数组的概念?
指针数组本质是数组,只是数组的每个元素都是⼀个指针(地址)
30、描述⼀下普通局部变量、普通全局变量、静态局部变量、静态全局变量的区别?
普通局部变量: 存在栈区、不初始化内容随机、只在定义所在的复合语句中有效、符合语句结束变量空间释放
普通全局变量 :存在全局区、不初始化内容为0、进程结束空间才被释放,能被当前源⽂件或其他源⽂件使⽤,只是其他源⽂件使⽤的时候,记得使⽤extern修饰 。
静态局部变量: 存在全局区、不初始化内容为0、整个进程结束空间才被释放,只能在定义所在的复合语句中有效。
静态全局变量:存在全局区、不初始化内容为0、整个进程结束空间才被释放,只能被当前源⽂件使⽤。
31、描述⼀下内存分区
程序在运⾏前:分为代码区、BSS段(未初始化数据区)、data段(初始化数据区)
程序在运⾏后:堆区、栈区、全局区(静态区)、⽂字常量区、代码区
32、在使⽤realloc给已分配的堆区空间追加空间时需要注意啥?
记得⽤指针变量保存realloc的返回值
33、结构体与共⽤体的区别是什么?
结构体中的成员拥有独⽴的空间、共⽤体的成员共享同⼀块空间,但是每个共⽤体成员能访问共⽤区的空间⼤⼩是由成员⾃⾝的类型决定34、谈谈⽂件的分类?
⽂件分为⼆进制和⽂本⽂件
⼆进制⽂件基于值编码,需要根据具体的应⽤才能知道某个值具体的含义
⽂本⽂件基于字符编码,⼀个字节⼀个意思,可以通过记事本打开
35、⽂件缓冲区刷新⽅式有⼏种?
⾏刷新、满刷新、强制刷新、关闭刷新
36、哪些情况会出现野指针?
指针变量未初始化、指针释放后未置为空、指针操作超越变量作⽤域
37、如何理解指针作为函数参数的输⼊和输出特性?
输⼊特性:主调函数分配空间 被调函数使⽤该空间
输出特性:被调⽤分配空间 主调函数使⽤该空间
38、如何理解结构体的浅拷贝与深拷贝?
当结构体中有指针成员的时候容易出现浅拷贝和深拷贝的问题。
浅拷⻉就是,两个结构体变量的指针成员指向同⼀块堆区空间,在各个结构体变量释放的时候会出现多次释放同⼀段堆区空间
深拷⻉就是,让两个结构体变量的指针成员分别指向不同的堆区空间,只是空间内容拷⻉⼀份,这样在各个结构体变量释放的时候就不会出现多次释放同⼀段堆区空间的问题
39、描述⼀下结构体对⻬规则?
1. 数组成员对⻬规则。第⼀个数组成员应该放在offffset为0的地⽅,以后每个数组成员应该放在offffset 为min(当前成员的⼤
⼩,#pargama pack(n))整数倍的地⽅开始(⽐如int在32位机器为4字节,#pargama pack(2),那么从2的倍数地⽅开始存储)。
2. 结构体总的⼤⼩,也就是sizeof的结果,必须是min(结构体内部最⼤成员,#pargama pack(n))的整数倍,不⾜要补⻬。
3. 结构体做为成员的对⻬规则。如果⼀个结构体B⾥嵌套另⼀个结构体A,还是以最⼤成员类型的⼤⼩对⻬,但是结构体A的起点为A
内部最⼤成员的整数倍的地⽅。(struct B⾥存有struct A,A⾥有 char,int,double等成员,那A应该从8的整数倍开始存储。),结构体A中的成员的对⻬规则仍 满⾜原则1、原则2。
40、啥叫宏函数以及作⽤?
在项⽬中,经常把⼀些短⼩⽽⼜频繁使⽤的函数写成宏函数,这是由于宏函数没有普通函数参数压栈、跳转、返回等的开销,可以调⾼程序的效率。 宏通过使⽤参数,可以创建外形和作⽤都与函数类似地类 函数宏(function-like macro). 宏的参数也⽤圆括号括起来,来保证宏函数的完整性。
41、如何理解库函数 ?
库是已经写好的、成熟的、可复⽤的代码。每个程序都需要依赖很多底层库,不可能每个⼈的代码从零开始编写代码,因此库的存在具有⾮常重要的意义。 在我们的开发的应⽤中经常有⼀些公共代码是需要反复使⽤的,就把这些代码编译为库⽂件。 库可以简单看成⼀组⽬标⽂件的集合,将这些⽬标⽂件经过压缩打包之后形成的⼀个⽂件。像在Windows这样的平台上,最常⽤的c 语⾔库是由集成按开发环境所附带的运⾏库,这些库⼀般由编译⼚商提供
42、sizeof和strlen的区别?
1、sizeof是⼀个操作符,strlen是库函数。
2、Sizeof的参数可以是数据的类型,也可以是变量,⽽strlen只能以结尾为’\0’的字符串作参数。
3、编译器在编译时就计算出了sizeof的结果。⽽strlen函数必须在运⾏时才能计算出来。并且sizeof计算的是数据类型占内存
的⼤⼩,⽽strlen计算的是字符串实际的长度。
43、&&和&、||和|有什么区别?
1、&和|对操作数进⾏求值运算,&&和||只是判断逻辑关系。
2、&&和||在在判断左侧操作数就能确定结果的情况下就不再对右侧操作数求值。
44、typedef 和 define 有什么区别
1、⽤法不同:typedef ⽤来定义⼀种数据类型的别名,增强程序的可读性。define 主要⽤来定义常量,以及书写复杂使⽤频繁
的宏。
2、执⾏时间不同:typedef 是编译过程的⼀部分,有类型检查的功能。define 是宏定义,是预编译的部分,其发⽣在编译之
前,只是简单的进⾏字符串的替换,不进⾏类型的检查。c语言如何创建字符串数组
3、作⽤域不同:typedef 有作⽤域限定。define 不受作⽤域约束,只要是在 define 声明后的引⽤都是正确的。
4、对指针的操作不同:typedef 和 define 定义的指针时有很⼤的区别。
5、typedef 定义是语句,因为句尾要加上分号。⽽ define 不是语句,千万不能在句尾加分号。
45、链表和数组有什么区别?
数组和链表有以下⼏点不同:
1、存储形式:数组是⼀块连续的空间,声明时就要确定长度。链表是⼀块可不连续的动态空间,长度可变,每个结点要保存相
邻结点指针。
2、数据查:数组的线性查速度快,查操作直接使⽤偏移地址。链表需要按顺序检索结点,效率低。
3、数据插⼊或删除:链表可以快速插⼊和删除结点,⽽数组则可能需要⼤量数据移动。
4、越界问题:链表不存在越界问题,数组有越界问题。
46、简述队列和栈的异同?
队列和栈都是线性存储结构,但是两者的插⼊和删除数据的操作不同,队列是“先进先出”,栈是“后进先出”
47、空指针和未初始化的指针是⼀回事吗?
空指针在概念上不同于未初始化的指针;空指针可以确保不指向任何对象或函数;⽽未初始化指针则可能指向任何地⽅。
48、static有什么⽤途?(请⾄少说明两种)
限制变量的作⽤域; 设置变量的存储域
49、引⽤与指针有什么区别?
引⽤必须被初始化,指针不必;引⽤初始化以后不能被改变,指针可以改变所指的对象;不存在指向空值的引⽤,但是存在指向空值的指针。
50、描述实时系统的基本特性
在特定时间内完成特定的任务,实时性与可靠性
51、全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
全局变量存储在静态区,局部变量存在堆栈
52、什么是平衡⼆叉树?
左右⼦树都是平衡⼆叉树且左右⼦树的深度差值的绝对值不⼤于1
左右⼦树都是平衡⼆叉树且左右⼦树的深度差值的绝对值不⼤于1
53、堆栈溢出⼀般是由什么原因导致的?
没有回收垃圾资源
54、冒泡排序算法的过程?时间复杂度是什么?空间复杂度?
假设排序是从⼩到⼤排序,从左到右依次⽐较两个相邻元素,发现左边的元素⼤于右边的元素就交换位置,直到最后⼀个元素,这趟排序可以将最⼤的元素转移到最后⼀个位置上,重复上述过程,直到出第N⼤的数,排序结束 O(n^2)
空间复杂度是O(n)
55、Internet采⽤哪种⽹络协议?该协议的主要层次结构?
采⽤tcp/ip五层⽹络协议,包括应⽤层/传输层/⽹络层/数据链路层/物理层
56、IP地址的编码分为哪俩部分?
IP地址由两部分组成,⽹络号和主机号。不过是要和“⼦⽹掩码”按位与上之后才能区分
57、局部变量能否和全局变量重名?
可以重名,局部变量会屏蔽全局变量
58、如何引⽤⼀个已经定义过的全局变量?
可以⽤引⽤头⽂件的⽅式,也可以⽤external关键字
59、全局变量可不可以定义在可被多个.C⽂件包含的头⽂件中?为什么?
可以,在不同的C⽂件中以static形式来声明同名全局变量。 可以在不同的C⽂件中声明同名的全局变量,前提是其中只能有⼀个C⽂件中对此变量赋初值,此时连接不会出错
60、语句for( ;1 ;)有什么问题?它是什么意思?
while(1)相同
61、do…while和while…do有什么区别?
前⼀个循环⼀遍再做判断,后⼀个判断之后再循环
62、程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存 在于(堆)中
63、队列和栈有什么区别?
队列先进先出,栈后进后出
64、对于⼀个频繁使⽤的短⼩函数,在C语⾔中应⽤什么实现?
⽤宏定义
65、直接链接两个信令点的⼀组链路称作什么?
PPP点到点连接
66、软件测试都有那些种类?
⿊盒:针对系统功能的测试 ⽩盒:测试函数功能,各函数接⼝
67、TCP/IP通信建⽴的过程怎样,端⼝有什么作⽤?
三次握⼿,端⼝确定是哪个应⽤程序使⽤该协议
68、进程和线程的差别。
线程是指进程内的⼀个执⾏单元,也是进程内的可调度实体.
与进程的区别:
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2)并发性:不仅进程之间可以并发执⾏,同⼀个进程的多个线程之间也可并发执⾏
(3)拥有资源:进程是拥有资源的⼀个独⽴单位,线程不拥有系统资源,但可以访问⾪属于进程的资源
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,
导致系统的开销明显⼤于创建或撤销线程时的开销。
总之线程和进程在使⽤上各有优缺点:线程执⾏开销⼩,但不利于资源管理和保护,进程与之相反
69、嵌⼊式系统中经常要⽤到⽆限循环,你怎么⽤C编写死循环。
while(1)或者for( ; ; )
70、关键字static的作⽤是什么?
定义静态变量
71、关键字const有什么含意?
表⽰常量不可以修改的变量
72、进程之间通信的途径
共享存储系统、消息传递系统、管道:以⽂件系统为基础
73、进程死锁的原因
资源竞争以及进程推进顺序⾮法
74、死锁的4个必要条件:互斥、请求与保持、不可剥夺、循环等待四个条件
75、死锁的处理:
(1)预防死锁。破坏死锁产⽣的四个必要条件中的⼀个或⼏个。
(2)避免死锁。⽤某种⽅法防⽌系统进⼊安全状态,从⽽避免死锁(银⾏家算法)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论