C++和C语言面试问题(持续更新)

第一部分:计算机基础

1.C/C++内存有哪几种类型?

C中,内存分为5个区,程序代码区全局/静态存储区常量存储区。此外,C++中有自由存储区一说。
全局变量和static变量会初始化为零,而堆和栈上变量是随机的不是确定的。

2.C/C++堆和栈的区别?

①堆存放动态分配的对象------程序运行时分配的对象,比如局部变量,其生存期由程序控制;
②栈用来保存定义在函数内的非static对象,仅在其定义的程序块运行时才存在;
③静态内存用来保存static对象,类static数据成员以及定义在任何函数外部的变量,static对象在使用之前分配,程序结束时销毁;
④栈和静态内存的对象由编译器自动创建和销毁。

3. 堆和自由存储区的区别?

①堆是C语言和操作系统的术语,是操作系统维护的一块动态分配内存;自由存储区是C++中通过new与delete动态分配和释放对象的抽象概念
②操作上,堆使用malloc()申请,free()释放;自由存储区用new动态分配建立对象和delete释放对象的抽象概念,通过new来申请的内存区域可称为自由存储区。new可以通过封装malloc来实现。

4.程序的编译过程?

过程:把编写的c/c++文件转化为可以执行的机器代码的过程。
主要过程:预编译 ,编译,汇编和链接。

在这里插入图片描述

5.函数调用的过程?

int main(void)
{
  ...
  d = fun(a, b, c);
  cout<<d<<endl;
  ...
  return 0;
}

调用fun()的过程如下:
①参数压栈,顺序是c->b->a
②保存d = fun(…)的下一条指令的地址,即cout<<d<<endl;
③跳转到fun()
在fun()执行
④把ebp,esp置值
⑤将局部变量,压栈(push),操作
⑥return
⑦出栈(pop)
⑧恢复ebp,esp
回到main
⑨执行cout<<d<<endl;

6.什么是左值,右值?

①左值能够出现在等号左边也能出现在等值右边的变量(或表达式),右值指的是只能出现在等号右边的变量(或表达式)。
比如说,malloc返回的就是一个右值,或者左值在程序中能够寻值,右值是一个具体得真实的值或对象,没法取到它的地址,因此无法对右值赋值。

7.const关键字

①定义时必须初始化
②指针可以是const的形参,也可以是指向const对象的指针
③定义为const的形参,在函数体内不能被修改
④const的成员函数可以被const或非const对象调用,但是普通成员函数(无const修饰)只能被普通对象调用。
⑤const修饰成员变量时,不能在声明时初始化,必须在构造函数的列表里初始化

8.static关键字(只要背前四条)

①在函数中,一个static的变量在此函数被调用过程中维持其值不变
②在模块中(不在函数中),一个static变量可以被模块中所有函数访问,但不可以被模块外的其他函数访问。
③类中的static成员变量属于整个类,不能在类内进行定义,只能在类的作用域中进行定义
④类中的static成员函数属于整个类,不包含this指针,只能用类名调用static成员函数
⑤static全局变量只能在本文件中使用,限制了它的作用域;而普通全局变量可以在其他文件中使用。
⑥static局部变量必须初始化,普通局部变量不需要;前者所在的函数被多次调用时,依据上一次的结果进行计算,而后者所在的函数被调用时,还是原来的值。虽然静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它。
⑦static函数限定在本文件中使用,虽然其他文件可以知道它的存在,但不能使用;而普通函数默认是extern的,其他文件也可以使用。Static函数有两个好处:一是其他文件可以定义相同名字的函数,不会冲突;二是静态函数不能为其他函数使用。

9.extern关键字

①extern C,表示该段代码以C语言进行编译。
②extern 放在变量或函数前,说明该变量或函数定义在别的文件中,提示编译器取其他模块中取定义,相当于前向声明;

10.指针和引用的区别

①引用是直接访问,指针是间接访问
②引用是变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间
③引用绑定内存空间(必须赋值),是一个变量别名不能更改绑定,可以改变对象的值。
总的来说,引用既有指针的效率,又具有变量使用的方便性和直观性
引用不可以为空,是别名,就好比别人的外号,这个人都不存在,外号就没意义了。
而指针,指针指向的是内存中的单元,指针可以为空,指针指向为NULL,实则指针是指向内存为0的地方,表明指针没有指向任何地方。

11.指针常量和常量指针区别

指针常量:指针这个对象所存储的地址是不可以改变的
常量指针:指向常量的指针的意思,不能通过该指针来改变所指向的对象。

参考博客:
https://blog.csdn.net/henu1710252658/article/details/83046649
https://blog.csdn.net/wsq_zqfl/article/details/104429090?ops_request_misc=%7B%22request_id%22%3A%22158288323919725256723740%22%2C%22scm%22%3A%2220140713.130056874…%22%7D&request_id=158288323919725256723740&biz_id=0&utm_source=distribute.pc_search_result.none-task

猜你喜欢

转载自blog.csdn.net/qq_38173631/article/details/104558494