C语言面试题目

发布时间:2023年12月27日
  • 1、C++是什么?
    • C++是在C的基础上开发的一种面向对象的编程语言,支持多种编程范式,面向对象编程。常用于系统开发等应用领域;支持类、封装、重载。、
  • 2、C和C++的区别?
    • C是结构化语言,重点在于算法和数据结构。C程序设计主要考察,如何通过一个过程,对输入进行运算处理得到输出。C++首要考虑是如何构造一个对象模型,让这个模型能够契合与之对应的问题。
  • 3、什么是多态?
    • 多态是指相同的操作或者函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象叫做多态。
  • 4、const的作用?
    • const 是 constant 的缩写,本意是不变的,不易改变的意思。在 C++ 中是用来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数。C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助。
  • 5、static的作用?
    • 我们知道在函数内部定义的变量,当程序执行到它的定义处时,编译器为它在栈上分配空间,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定义为全局的变量,但定义一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅只受此函数控制)。static 关键字则可以很好的解决这个问题。
    • 静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;
    • 在定义不需要与其他文件共享的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用。
    • 类的静态成员变量在类实例化之前就存在了,并且分配了内存。函数的static变量在执行函数时进行初始化。
  • 堆和栈的区别?堆和栈的生命周期:
    • 空间分配区别:栈是由操作系统自动分配和释放的,,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构中的栈。堆是一般由程序员分配释放的,若程序员不释放,程序结束时间可能由OS回收,分配方式类似于链表。
    • 缓存方式区别:栈使用的是一级缓存,他们通常都是被调用时处于存储空间、调用完毕之后释放;堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定的,所以调用这些对象的速度相对来说低一点。
    • 数据结构区别:堆可以被看作树(堆排序)栈是一种先进后出的数据结构。
  • 6、解释封装、继承、多态
    • 封装:将数据或者函数集合在一个个的单位中。意义在于保护或者防止代码被我们无意破坏。继承主要实现重用代码,节省开发时间,子类可以继承父类的东西。多态是通过一操作作用不同的对象会有不同的解释。
  • 7、指针和引用的区别
    • 指针存储的是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元。
    • 引用是原变量的一个别名,跟原来的变量实质上是同一个东西。
    • int a = 996;int *p = &a; // p是指针, &在此是求地址运算 int &r = a; // r是引用, &在此起标识作用
    • 指针可以是多级而引用不可以是多级,指针可以指向NULL而引用不可以,指针初始化之后可以改变,而引用不可以。
  • 8、什么是内存泄漏?如何避免
    • 用动态存储分配开辟的空间,在使用完毕之后未释放,结果导致一直占用该内存单元即问内存泄漏。
    • 如何避免:
      • 使用是要记得指针的长度,malloc的时候要确定在哪里free,对指针赋值的时候应该注意被赋值指针需不需要被释放。动态分配内存的指针最好不要再次赋值。
  • 9、new\malloc的区别
    • 1、malloc与free是C++/C语言的标准库函数、new/delete是C++的运算符。它们都可以申请动态内存、和释放内存。
    • 2、 malloc和free是库函数,而new和delete是C++操作符;
    • 3、 malloc能够直观地重新分配内存
      • 使用malloc分配的内存后,如果在使用过程中发现内存不足,可以使用realloc函数进行内存重新分配实现内存的扩充。realloc先判断当前的指针所指内存是否有足够的连续空间,如果有,原地扩大可分配的内存地址,并且返回原来的地址指针;如果空间不够,先按照新指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来的内存区域。new没有这样直观的配套设施来扩充内存。
  • 10、define\const\typedef\inline
    • typedef
    • 类型重命名可以写在函数外部,同样也可以函数内部,它们的作用域不同,可以提高代码的可读性。typedef 可以分别为基本类型重命名、指针类型重命名、结构体类型重命名和函数指针类型重命名
    • define
    • 宏的本质是替换,它不进行计算,只在编译时进行单纯的文本替换,因为宏定义是预编译指令(前面带#号的)不是语句,所以后面不加 “;” 分号。enum给int型常量起名字,typedef给数据类型起名字,宏定义也可以看做一种重命名
    • incline
      • C++ 中使用 inline 定义内联函数(C 语言中一般是使用 #define 定义宏函数)。宏函数是简单的文本替换,不是真正的传参数,如果不注意运算顺序很容易出错,C++ 使用 inline 定义内联函数,比定义宏函数可靠,inline 定义的内联函数是真正的传递参数,C++ 中 inline 可用于常规函数也可用于类方法。
    • const
      • const 常量限定符,声明的常量只读,不允许修改。在 C++ (不是 C) 中可以用 const 值声明数组长度。对于全局 const 值,C++ 中默认是内部链接(跟 static 一样只允许在本文件内可见),而不是 C 中的默认外部链接,若想在其他文件中使用必须在其他文件中重新定义或将 const 值放在头文件中(默认是外部链接放在头文件中编译可能会出现错误,默认是内部链接就不会出错)
  • 11、局部变量和全局变量能不能重名
    • 能,且局部变量可以屏蔽全局变量。
  • 12、如何引用一个已经定义过的全局变量?
    • 可以采用头文件的方式,也可以采用extern关键字。如果引用头文件的方式来引用某一个全局变量,假设将变量写错了,那么那么会在编译期间报错。如果采用extern方式,在编译期间不会报错,而在连接阶段报错。
  • 一、计算机语言的发展
    • 1.机器语言
    • 2.汇编语言
    • 3.高级语言
    • 高级语言又经历了:非结构化,结构化,面向对象的发展历程。
  • 二、C语言的注释方法
    • 1.单行注释
    • 如: int i ; //声明变量
    • 2.多行注释
  • 第三章 最简单的C程序设计—顺序程序设计
    • 一、数据类型
    • 1.常量:在程序运行过程中,其值不能被改动的量为常量。
    • 包括:整型常量、实型常量、字符常量、字符串常量、符号常量
    • 符号常量:用#define指令,指定用一个符号代表一个常量。如:
    • #define PI 3.14
    • 注意:结尾没有分号!!!!!!!!!
    • 2.变量:在程序运行期间其值可以改变,变量必须先定义后使用。
    • 3.常变量:在定义变量时,前面加一个关键字const。如:
    • const int a = 1 ;
    • 4.标识符
    • C语言中标识符,由数字、字母、下换线组成,首位不能是数字。
    • 5.数据类型
    • (1) 只有整型(包括字符型)数据可以加signed或unsigned修饰符,实型数据不能加。
    • (2) 对无符号整型数据用“%u”格式输出。%u表示用无符号十进制数的格式输出。
  • 二、运算符与表达式
    • 1.自增(++)自减(--)运算符
    • ++i是先执行i=i+1,再使用i的值;而i++是先使用i的值,再执行i=i+1。
    • 2.强制类型转换
    • (double)a 将a转换成double型
    • (int)(x+y) 将x+y的值转换成int型
    • (float)(5%3) 将5%3的值转换成float型
    • 注意:强制类型转换时“()”不能忘记,如下:
    • (int)x+y 只将x转换成整型,然后与y相加 int a; float x,y;double b; a=(int)x 进行强制类型运算(int)x后得到一个int类型的临时值,它的值等于x的整数部分,把它赋给a,注意x的值和类型都未变化,仍为float型。该临时值在赋值后就不再存在了。
    • 3.赋值运算
    • 如果赋值运算符两侧的类型不一致,但都是基本类型时,在赋值时要进行类型转换。类型转换是由系统自动进行的,转换的规则是:
    • 将浮点型数据(包括单、双精度)赋给整型变量时,先对浮点数取整,即舍弃小数部分,然后赋予整型变量。
    • 将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中。
    • 将一个double型数据赋给float变量时,先将双精度数转换为单精度,即只取6~7位有效数字,存储到float型变量的4个字节中。应注意双精度数值的大小不能超出float型变量的数值范围;
    • 将一个float型数据赋给double型变量时,数值不变,在内存中以8个字节存储,有效位数扩展到15位。
    • 字符型数据赋给整型变量时,将字符的ASCII代码赋给整型变量。
    • 将一个占字节多的整型数据赋给一个占字节少的整型变量或字符变量时,只将其低字节原封不动地送到被赋值的变量(即发生“截断”)。
  • 三、数据的输入和输出
    • 1.C语言没有自己特定的输入输出函数,都是由库函数提供的在使用时,要在源文件头部加上#include
    • #include指令说明
    • 三种形式:
    • #include "c:\cpp\include\myfile.h" 按指定路径查找文件
    • #include "myfile.h“源程序文件所在目录
    • #include C编译系统指定的include目录
    • 2.printf函数
    • printf(格式控制,输出表列);
    • (1) “格式控制”是用双引号括起来的一个字符串,称为格式控制字符串,简称格式字符串。包括: ① 格式声明。格式声明由“%”和格式字符组成。作用是将输出的数据转换为指定的格式后输出。 ② 普通字符。普通字符即需要在输出时原样输出的字符。
    • (2) 输出表列是程序需要输出的一些数据,可以是常量、变量或表达式。
    • 以带符号的十进制形式输出整数(正数不输出符号)
    • 以八进制无符号形式输出整数(不输出前导符0)
    • 以指数形式输出实数,用e时指数以“e”表示(如1.2e+02),用E时指数以“E”表示(如1.2E+02)
文章来源:https://blog.csdn.net/weixin_53908842/article/details/135231800
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。