【最全】C面试题

1.基本数据类型和范围

C语言的基本数据类型包括charintfloatdouble

  • char:通常用于存储字符,其范围取决于编译器和系统,但通常为-128到127(以ASCII码为例)。

  • int:用于存储整数,其范围取决于编译器和操作系统,通常为-32,768到32,767(以16位整数为例)。

  • floatdouble:用于存储浮点数,其范围非常大,但具体数值取决于IEEE 754标准。

2.计算机如何存储浮点数的

C++中,浮点数的存储分为两种,float(单精度)和double(双精度)。

float占4字节,32位,double占8字节,64位,二者在内存中的存储形式如下:

无论是单精度还是双精度在存储中都分为三个部分:

   1. 符号位(Sign) : 0代表正,1代表为负
   2. 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储
   3. 尾数部分(Mantissa):尾数部分
​
     存储规定:

按照国际标准IEEE 754,任意一个进制浮点数V可以表现成下面的形式:

V = (-1)^S * M * 2^E

    其中 (-1)^S 表示有效数字,当S为0时,V为正数,S为1时,V是负数。
    M表示有效数字,范围规定:大于1,小于2。
    2^E表示的是指数位。
    要将一个浮点数写成进制形式:一定需要S、M、E的值。

例如: 5.5 进制形式:

先将整数部分与小数部分分开换算: ​ 整数: 101 ​ 小数: 0.1 小数点后面 2^-1 = 1/2 = 0.5

    由此可以看出:V = (-1)^S * M * 2^E

5.5 --> 101.1 —> 1.011 * 2^2 ​ 所以 S = 0,M = 1.011,E = 2;

因为以上知道,

1.M是有效数字,范围:1<=M<2,在计算机内存保存M时,默认这个数第一位总是1,可以被舍去(在读取的时候,再把第一位加上),只保 留小数点后面的;如:当保留 101.1 时:只保存了 011,为了更方便理解.

2.E 是一个无符号数字(unsigned int)。 因为在8位的时候,其有范围0 ~ 255;而在11位的时候,其范围是 0 ~ 2047,但是由科学计数法知道,这时可以有负数的,(当存入 0.5 时,E = -1),所以在IEEE 754规定:存入内存时E的真实值需要加上一个中间值,对于8位来说其中间值是 127 ,对于11位来说其中间值是 1024. 对于指数E从内存中取出分为三种: 1.当E全为0时:也就是说指数E的真实值等于 -127,有效数字M不再加上1,而是0.xxxxxx这样的小数,这样做的目的是为了表示这样几乎很小很小的数,接近与0。 2.当E全为1时:也就是说这样的数表示无穷大(正负取决于S)。 3.当E有1有0时:即指数E的计算值减去127(或1024)得到真实值,然后由规定正数部分必须为1,(即M取出后加1)。

3.全局变量、局部变量、模块变量在内存空间中如何存放?

全局变量在全局空间分配。

局部变量在栈空间分配。

模块变量(通常指静态变量)也在全局空间分配,但其作用范围限制在定义它的模块内

4.内存详细分区

内存(在计算机科学中通常指的是主存储器或随机存取存储器,即RAM)在逻辑上可以被划分为几个不同的区域或段,这些区域或段用于不同的目的和存储不同的数据类型。然而,具体的分区方式可能因操作系统、处理器架构和应用程序的不同而有所差异。以下是一些常见的内存分区:

  1. 代码区(Code or Text Segment)

    • 存储程序执行的机器代码(即编译后的二进制代码)。

    • 通常是只读的,以防止程序意外修改自己的代码。

  2. 数据区(Data Segment)

    • 通常分为两个子区:初始化数据区(Initialized Data)和未初始化数据区(Uninitialized Data 或 BSS)。

    • 初始化数据区:存储程序中已明确赋值的全局变量和静态变量。

    • 未初始化数据区(BSS):存储未明确赋值的全局变量和静态变量,这些变量在程序开始执行前被初始化为零(或空)。

  3. 堆区(Heap)

    • 用于动态内存分配。当程序员使用如 malloccallocnew 等函数在运行时请求内存时,这些内存通常从堆中分配。

    • 程序员负责在不再需要这些内存时释放它们(使用如 freedelete 等函数),否则可能会导致内存泄漏。

  4. 栈区(Stack)

    • 用于存储局部变量和函数调用的信息(如返回地址、参数等)。

    • 由编译器自动分配和释放,其操作方式遵循“后进先出”(LIFO)的原则。

  5. 静态存储区

    • 通常与数据区重叠,但强调存储的是静态数据(即全局变量和静态变量)。

    • 这些变量的生命周期是整个程序的执行期间。

  6. 映射文件或共享内存区

    • 在某些操作系统中,可以将文件或其他对象的内存映射到进程的地址空间中。

    • 共享内存允许多个进程访问同一块物理内存,从而实现进程间的通信和数据共享。

  7. 其他内存区

    • 根据特定的操作系统、处理器架构或应用程序需求,还可能存在其他特定的内存区,如内存映射的I/O设备、图形缓冲区等。

5.内存的最小存储单位和最小计量单位分别是什么?

  • 内存的最小存储单位是二进制位(bit)。

  • 内存的最小计量单位是字节(byte),通常8位组成1字节。

6.函数指针与递归

  • 什么是函数指针?

    • 函数指针是指向函数的指针变量,可以用来调用函数或传递函数作为参数。

  • 解释递归函数

    • 递归函数是一个可以调用自身的函数。递归函数是一个可以调用自身的函数。在递归函数中,函数会反复调用自己,直到满足终止条件为止。

7.什么是结构体?

  • 结构体是一种用户自定义的数据类型,它可以包含多个不同类型的变量,这些变量可以通过一个结构名来访问。

8.C语言中如何进行字符串操作?

  • C语言提供了一系列字符串库函数,如strcpy()strcat()strlen()等,用于复制、连接、计算字符串长度等操作。

9.结构体为什么要内存对齐?

  • 结构体内存对齐是计算机内存管理中的一个重要概念,它对于程序的性能和正确性有着重要影响。以下是结构体内存对齐的主要原因:

  • 性能优化: CPU访问内存时,通常会以一定的块大小(例如4字节、8字节等)为单位进行读取。如果结构体中的数据成员没有对齐到这样的块边界,CPU可能需要执行额外的操作(如两次内存访问)来读取一个成员,这称为“未对齐访问”。未对齐访问会降低CPU的访问效率,增加程序的执行时间。 内存对齐可以确保结构体中的数据成员都位于合适的块边界上,从而提高CPU的访问效率。

  • 硬件限制: 某些硬件平台对内存访问有严格的对齐要求。如果结构体中的数据成员没有正确对齐,硬件可能会抛出异常或产生错误的结果。 通过内存对齐,可以确保结构体中的数据成员满足硬件平台的对齐要求,从而避免潜在的硬件问题。

  • 可移植性: 不同的编译器和硬件平台可能对内存对齐有不同的要求。如果不进行内存对齐,同一个结构体在不同的编译器或硬件平台上可能会有不同的内存布局和大小。 通过使用标准的数据类型和编译器特定的对齐指令(如#pragma pack),可以确保结构体在不同平台上的内存布局和大小一致,从而提高程序的可移植性。

  • 空间利用率: 虽然内存对齐可能会增加结构体所占用的总内存空间(因为编译器会在成员之间插入填充字节以确保对齐),但在某些情况下,这可以提高内存访问的效率并减少缓存未命中的可能性。 此外,合理的内存对齐还可以帮助减少内存碎片,提高内存管理的效率。

  • 简化编译器实现: 对于编译器来说,处理未对齐的内存访问需要额外的逻辑和复杂

### 回答1: 计算机考研复试面试题库中的C语言题目涵盖了从基础知识到高级应用的各个方面。在C语言的基础知识部分,面试题可能会测试对于数据类型、运算符、循环语句、条件语句等基础概念的掌握程度。例如,题目可能会要求解释int和float等数据类型的区别,以及在不同情况下它们的使用场景。 在C语言的进阶部分,面试题可能会要求解决一些具体的编程问题。这些问题可能会涉及到递归、指针、内存分配等较为复杂的概念。例如,题目可能会要求写一个递归函数来求解斐波那契数列,或者通过指针实现对数组的排序。 此外,面试题库中的C语言题目还可能会考察对于C语言标准库的使用。例如,题目可能会要求使用标准库函数来处理字符串或者文件操作。 总的来说,面试题库中的C语言题目涵盖了广泛的知识点,从基础概念到高级应用都有所覆盖。解答这些问题需要对C语言语法有深入的理解,并能够熟练运用C语言来解决实际问题。因此,在准备计算机考研复试的C语言面试时,可以通过多做题目、深入学习C语言的相关知识,并根据题目要求练习编程,来提高自己的应对能力。 ### 回答2: 计算机考研复试面试题库中的C语言题目是为了检验考生在C语言编程方面的能力和理解程度。这些题目通常包括基础语法、数据类型、运算符、控制语句、函数、指针、结构体、文件操作、内存管理等内容。 其中,基础语法部分考察考生对C语言的基本语法规则的掌握程度,如变量的声明与赋值、运算符的使用、数据类型的转换等。数据类型部分涵盖整型、浮点型、字符型等数据类型的使用以及类型转换的注意事项。 控制语句题目测试考生对条件语句(if-else)、循环语句(for、while、do-while)、选择语句(switch-case)的理解与应用。函数部分包括函数的定义与调用、函数参数的传递方式、递归等。指针部分考察考生对指针的理解与运用,如指针的定义与初始化、指针的运算、指针和数组的关系等。 结构体题目会提供结构体的定义,并要求考生进行相关操作,如结构体的初始化、结构体成员的访问、结构体数组的排序等。文件操作题目涉及文件的打开、读写、关闭等基本操作。 内存管理题目会考察考生对内存的动态分配(malloc、calloc、realloc)、释放(free)的理解与应用,以及内存泄漏问题的预防与解决。 回答这些C语言题目,考生需要熟练掌握C语言的语法和相关概念,并能够分析和解决一些常见的编程问题。灵活运用所学的知识,能够通过编写代码来实现相应的功能。同时,对于一些较为复杂的题目,考生需要具备一定的逻辑思维能力和分析问题的能力。 ### 回答3: 计算机考研复试面试题库中的C语言部分通常包含以下几个方面的内容。 首先是基本语法和数据类型。面试官可能会问到C语言中常用的数据类型,如整型、浮点型、字符型,以及涉及到类型转换和类型限定符等内容。此外,面试官也可能会关注C语言中的基本语法规则,如变量的声明和定义、运算符的使用、控制语句和循环语句等等。 其次是函数和指针的应用。C语言的函数和指针是非常重要的概念,面试官可能会考察应聘者对函数的定义和调用的理解,以及指针的定义和使用。例如,他们可能会要求写一个交换两个整数的函数或者编写一个所需功能的函数。对于指针,他们可能会询问指针的概念、指针的运算和指针与数组的关系等。 此外,面试官也可能会触及C语言中的内存管理和动态内存分配。他们可能会问到如何动态地申请内存、释放内存以及内存泄漏的产生原因和如何避免。了解内存管理的概念和使用方法对于C语言编程非常重要。 最后,面试官可能会考察面试者对C语言程序的调试和错误处理能力。他们可能会以编写一个程序或者给出一段有错误的代码让应聘者进行分析、调试或者修改。 总之,在备战计算机考研复试的C语言面试时,需要准备基本语法、数据类型、函数和指针、内存管理和动态内存分配、调试和错误处理等相关知识。多进行实际编程练习,提高自己的动手能力,同时也要注重理论知识的积累和掌握。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱编程的小猴

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

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

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

打赏作者

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

抵扣说明:

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

余额充值