C语言常见简答题

本文详细介绍了C语言的关键特性,如数据类型、变量的定义与使用、函数的组织、预处理器和编译过程,还涵盖了内存管理、指针、数组、结构体、文件操作、内存分区以及常见的编程概念如栈、队列和静态/动态变量。
摘要由CSDN通过智能技术生成
1、c语言的特点

c语言的数据类型丰富,具有现代语言的各种数据结构,能实现复杂的运算。c语言使用灵活方便,便于实现程序的结构化,节省内存。

2、c语言为什么要规定变量要“先定义,后使用”?

凡是未被事先定义的变量,在使用过程中不会被当作变量名,这样能够保证程序中的变量名使用正确。每一个变量被指定一个确定的数据类型,在编译时就能为其分配相应的存储单元。指定一个变量属于一个类型,在编译的时候就能检查该变量是否使用正确。通俗来讲,给变量一个存储位置,方便操作。

3、c 语言的主要用途:

c语言主要用于程序的编程开发,和其他的高级语言相比,C语言采用符号形式,提供许多高级的程序结构,供编写人员编写复杂的程序。C语言是面向问题的语言,独立于具体的机器,比较接近人的语言习惯,能更有效的描述各种算法。c语言具有绘图能力和可移植性,有更强的数据处理能力,适用于编写系统软件、二维、三维图形和动画。

4、一个程序由那几部分构成

程序名、预编译指令、标准的输入输出、c语言的主函数、函数开始标志、定义变量、给变量赋值、输出结果、程序正常结束、函数结束标志。

5、为什么C 语言以函数为程序的基本单位

函数是程序的基本组成单位,可以用函数作为程序模块来实现C语言程序。利用函数不仅可以使程序模块化,而且可以使程序设计的简单和直观,提高程序的可读性和可维护性。还可以把程序中的一些计算编成通用函数,以供随时使用。

6、关键字和一般标识符有什么不同?

标识符用来标识源程序中的某个对象的名字,一个标识符由字母、数字和下划线组成。关键字可以定义变量、表达式语句功能和对一些文件进行预处理,关键字已被编译系统本身使用,所以用户编写程序时不能够使用这些关键字来作为标识符,如int,if,for等。

7、if语句中的条件表达式可以是任意的合法表达式吗?Switch语句中break的作用是什么?

可以是任意数值。在switch语句中,break语句可使流程立即跳出switch语句体,不执行break后的case。

8、三种循环结构中的条件是循环进行的条件还是循环结束的条件?循环结构中break语句和continue语句的作用是什么,二者有何区别?

for语句、while语句:循环进行的条件;

do-while语句:循环结束的条件;

break可用于switch语句,表示跳出整个switch块,

而continue则不能用于switch语句,

它们都可用于循环语句的循环体,break用于立即退出当前循环,而continue仅跳过当次循环,本次循环体内不执行continue语句后的其他语句,但下次循环还会执行。

9、字符数组与字符串是否相同?若不相同,有何区别?

不相同,C语言中没有专门的字符串变量,如果要将一个字符串存放在变量中,必须使用字符数组,即用一个字符型数组来存放一个字符串,数组中每一个元素放一个字符。字符串必须以’\0’结尾,字符数组可以包含多个’\0’

10、函数的嵌套调用与递归调用有什么区别?

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

11、结构体类型与我们前面学过的基本类型有哪些区别?

结构体是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型。

特点:1、结构体可以在一个结构体中声明不同的数据类型;

           2、相同的结构的结构体变量可以相互赋值,而数组不行,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以做为左值进行运算,所以数组之间就不能通过数组名称相互复制,即使数据类型和数组大小完全相同。

           3、节省内存空间。

           4、高效率。

12、指针与地址有什么联系?在使用指针的过程中应注意哪些细节?指针类型对于程序设计有哪些意义?

指针保存了某个变量的地址,指针本身是一个变量,它也有自身的地址,而指针的内容是某个变量的地址。注意细节:要初始化、正确的传递地址方式、使用时要判断。指针可以用来有效地表示复杂的数据结构,可以用于函数参数传递并达到更加灵活使用函数的目的,使C语言程序设计具有灵活、实用、高效的特点。

13、描述一下gcc的编译过程

gcc编译过程分为4个阶段:预处理、编译、汇编、链接。
预处理:头文件包含、宏替换、条件编译、删除注释
编译:主要进行词法、语句、语义分析等,检查无误后将预处理好的文件编译成汇编文件。
汇编:将汇编文件转换成二进制目标文件
链接:将项目中的各个二进制文件+所需的库+启动代码链接成可执行文件。

14、内存的最小存储单位以及内存的最小计量单位分别是

内存的最小存储单位为二进制,内存的最小计量单位是字节

15、#include<>与#include””的区别

Include<>到指定的目录找头文件,#Include””先到项目所在目录找头文件,如果没有找到再到系统指定的目录下寻找

16、描述一下变量的命名规则

变量名由字母、数字、下划线构成,变量名只能由字母、下划线开头。

17、变量的声明与定义有什么区别

声明变量 不需要建立存储空间,变量的定义需要建立存储空间。为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明,但是只在一个地方定义。加入 extern 修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间,如外部变量。

18、c语言中有符号和无符号的区别

有符号:数据的最高位为符号位,0表示正数,1表示负数
无符号:数据的最高位不是符号位,而是数据的一部分

有符号数的表示范围仅是无符号数表示范围的一半

19、补码的意义

统一了零的编码;将符号位与其他位统一处理将减法运算转换成加法运算

20、数组的特点

同一个数组所有的成员都是相同的数据类型,同时所有的成员在内存中的地址是连续的

21、数组的分类

数组的分类主要是:静态数组、动态数组两类。
静态数组:类似int arr[5];在程序运行就确定了数组的大小,运行过程不能更改数组的大小。
动态数组:主要是在堆区申请的空间,数组的大小是在程序运行过程中确定,可以更改的大小。

22、描述一下一维数组的不初始化、部分初始化、完全初始化的不同点

不初始化:如果是局部数组 数组元素的内容随机 如果是全局数组,数组的元素内容为0
部分初始化:未被初始化部分自动补0
完全初始化:如果一个数组完全初始化可以省略元素的个数 数组的大小由初始化的个数确定

23、数组名作为类型、作为地址、对数组名取地址的区别

数组名作为类型:代表的是整个数组的大小
数组名作为地址:代表的是数组首元素的地址
对数组名取地址:代表的是数组的首地址

24、二维数组在物理上以及逻辑上的数组维度理解

二维数组在逻辑上是二维的,在物理上是一维的,按照先行后列原则存储

25、函数的定义与函数的声明之间的区别

函数定义:是指对函数功能的确立、包括指定函数名、函数类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。
函数的声明:是把函数的名字、函数类型以及形参的个数、类型和顺序通知编译系统,以便在对包含函数调用的语句进行编译时,据此对其进行对照检查(例如函数名是否正确,实参与形参的类型和个数是否一致)

26、指针与指针变量的区别

指针:指针是内存地址,指针变量是指针变量是用来存放内存地址的变量,不同类型的指针变量所占用的存储单元长度是相同的,但由于指针指向的地址存放的数据类型不同,内容所占的存储空间各有不同。

27、描述一下32位或64位平台下指针的大小

32位平台:任意类型的指针大小为4字节
64位平台:任意类型的指针大小为8字节

28、描述一下指针数组的概念

指针数组本质是数组,只是数组的每个元素都是一个指针(地址)

每个元素都是指针

29、普通局部变量、普通全局变量、静态局部变量、静态全局变量的区别

普通局部变量: 存在栈区、不初始化内容随机、只在定义所在的复合语句中有效、符合语句结束变量空间释放
普通全局变量 :存在全局区、不初始化内容为0、进程结束空间才被释放,能被当前源⽂件或其他源⽂件使⽤,只是其他源⽂件使⽤的时候,记得使用extern修饰 。
静态局部变量: 存在全局区、不初始化内容为0、整个进程结束空间才被释放,只能在定义所在的复合语句中有效。
静态全局变量:存在全局区、不初始化内容为0、整个进程结束空间才被释放,只能被当前源⽂件使⽤。

30、内存分区

程序在运行前:分为代码区、BSS段(未初始化数据区)、data段(初始化数据区)
程序在运行后:堆区、栈区、全局区(静态区)、文字常量区、代码区

31、使用molloc给已分配的堆区空间追加空间时需要注意什么

记得用指针变量保存molloc的返回值,realloc函数进行空间释放。

32、结构体与共用体的区别是什么

结构体中的成员拥有独立的空间、共用体的成员共享同一块空间,但是每个共用体成员能访问共用区的空间大小是由成员自身的类型决定。共用体结构中某一瞬时是一种类型。

33、文件的分类

文件分为二进制和文本文件
二进制文件基于值编码,需要根据具体的应用才能知道某个值具体的含义
文本文件基于字符编码,一个字节一个意思,可以通过记事本打开

34、文件缓冲区刷新方式

行刷新、满刷新、强制刷新、关闭刷新

35、哪些情况会出现野指针

指针变量未初始化、指针释放后未置为空、指针操作超越变量作用域

36、理解指针作为函数参数的输入和输出特性

输入特性:主调函数分配空间,被调函数使用该空间
输出特性:被调用分配空间,主调函数使用该空间

37、结构体的浅拷贝与深拷贝

当结构体中有指针成员的时候容易出现浅拷贝和深拷贝的问题。
浅拷⻉就是,两个结构体变量的指针成员指向同⼀块堆区空间,在各个结构体变量释放的时候会出现多次释放同⼀段堆区空间
深拷⻉就是,让两个结构体变量的指针成员分别指向不同的堆区空间,只是空间内容拷⻉⼀份,这样在各个结构体变量释放的时候就不会出现多次释放同⼀段堆区空间的问题

38、宏函数以及作用

在项⽬中,经常把⼀些短⼩⽽⼜频繁使⽤的函数写成宏函数,这是由于宏函数没有普通函数参数压栈、跳转、返回等的开销,可以调⾼程序的效率。 宏通过使⽤参数,可以创建外形和作⽤都与函数类似地类 函数宏(function-like macro). 宏的参数也⽤圆括号括起来,来保证宏函数的完整性。

39、理解库函数

库是已经写好的、成熟的、可复⽤的代码。每个程序都需要依赖很多底层库,不可能每个⼈的代码从零开始编写代码,因此库的存在具有⾮常重要的意义。 在我们的开发的应⽤中经常有⼀些公共代码是需要反复使⽤的,就把这些代码编译为库⽂件。 库可以简单看成⼀组⽬标⽂件的集合,将这些⽬标⽂件经过压缩打包之后形成的⼀个⽂件。像在Windows这样的平台上,最常⽤的c语⾔库是由集成按开发环境所附带的运⾏库,这些库⼀般由编译⼚商提供

40、sizeof和strlen的区别

  sizeof是一个操作符,strlen是库函数。
  Sizeof的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为’\0’的字符串作参数。
  编译器在编译时就计算出了sizeof的结果。而strlen函数必须在运行时才能计算出来。并且sizeof计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度。

41、&&和&、||和|有什么区别

&和|对操作数进行求值运算,&&和||只是判断逻辑关系。
&&和||在在判断左侧操作数就能确定结果的情况下就不再对右侧操作数求值。

42、typedef 和 define 有什么区别

用法不同:typedef 用来定义一种数据类型的别名,增强程序的可读性。define 主要用来定义常量,以及书写复杂使用频繁的宏。

执行时间不同:typedef 是编译过程的一部分,有类型检查的功能。define 是宏定义,是预编译的部分,其发生在编译之前,只是简单的进行字符串的替换,不进行类型的检查。

作用域不同:typedef 有作用域限定。define 不受作用域约束,只要是在 define 声明后的引用都是正确的。

对指针的操作不同:typedef 和 define 定义的指针时有很大的区别。

typedef 定义是语句,因为句尾要加上分号。而 define 不是语句,千万不能在句尾加分号。

43、链表和数组有什么区别

数组和链表有以下几点不同:
存储形式:数组是一块连续的空间,声明时就要确定长度。链表是一块可不连续的动态空间,长度可变,每个结点要保存相邻结点指针。
数据查找:数组的线性查找速度快,查找操作直接使用偏移地址。链表需要按顺序检索结点,效率低。
数据插入或删除:链表可以快速插入和删除结点,而数组则可能需要大量数据移动。
越界问题:链表不存在越界问题,数组有越界问题。

44、简述队列和栈的异同

队列和栈都是线性存储结构,但是两者的插入和删除数据的操作不同,队列是“先进先出”,栈是“后进先出”

45、空指针和未初始化的指针

空指针在概念上不同于未初始化的指针;空指针可以确保不指向任何对象或函数;而未初始化指针则可能指向任何地方。

46、static有什么用途?(请至少说明两种)

限制变量的作用域; 设置变量的存储域

47、引用与指针有什么区别

引用必须被初始化,指针不必;引用初始化以后不能被改变,指针可以改变所指的对象;不存在指向空值的引用,但是存在指向空值的指针。

48、实时系统的基本特性

特定时间内完成特定的任务,实时性与可靠性

49、全局变量和局部变量在内存中是否有区别?如果有,是什么区别

全局变量存储在静态区,局部变量存在堆栈

50、什么是平衡二叉树

左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1

51、堆栈溢出一般是由什么原因导致的

没有回收垃圾资源

52、冒泡排序算法的过程?时间复杂度是什么?空间复杂度?

假设排序是从小到大排序,从左到右依次比较两个相邻元素,发现左边的元素大于右边的元素就交换位置,直到最后一个元素,这趟排序可以将最大的元素转移到最后一个位置上,重复上述过程,直到找出第N大的数,排序结束 O(n^2)
空间复杂度是O(n)

53、局部变量能否和全局变量重名

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

54、如何引用一个已经定义过的全局变量

可以用引用头文件的方式,也可以用external关键字

55、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?

可以,在不同的C文件中以static形式来声明同名全局变量。 可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错

56、语句for( ;1 ;)有什么问题?它是什么意思?

while(1)相同;无限循环,死循环

57、do…while和while…do有什么区别

前一个循环一遍再做判断,后一个判断之后再循环

58、程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存 在于(堆)中
59、队列和栈有什么区别

队列先进先出,栈后进先出

60、static 、const

关键字static的作用是什么?
定义静态变量

关键字const有什么含意?
表示常量不可以修改的变量

  • 16
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值