Linux C/C++面试题汇总

Linux C/C++面试题汇总

  • 前言
  • 计算机基础
    • 程序的内存空间
    • 进程和线程相关
  • 关键字
    • const
    • static
    • volatile
  • C/C++
    • 指针

前言

最近面试的比较多,看了很多关于面试的内容,有些平时工作用的比较少或者没有主要到的地方,长时间不看就会忘记,如果下次面试还需要再次找这些东西比较麻烦,所以写此篇文章就是为了方便以后面试,也给一些即将面试的人提供一些帮助。以后如果面试有新的值得关注的问题作者会及时更新。

计算机基础

程序的内存空间

Linux C/C++面试题汇总_第1张图片
堆栈段(stack)
由编译器自动分配和释放,存放函数的参数和局部变量。操作方式类似于数据结构中的栈。
堆(heap)
由程序员分配和释放。如果程序员没有释放,在程序结束时由操作系统释放。堆得操作方式和数据结构中的堆不同,堆空间的操作方式类似于链表。
BSS
存放未初始化的全局变量和static静态变量。
数据段(data)
存放初始化之后的全局变量和static静态变量
代码段
以二进制格式存放程序和函数主体。

进程和线程相关

  1. 进程有独立的地址空间,是资源分配的最小单位。线程没有独立的地址空间,是系统调度的最小单位(执行运算的最小单位)。
  2. 一个程序最少有一个进程,一个进程最少有一个线程。
  3. 线程的崩溃基本上会导致进程的崩溃,所以多进程比多线程的程序健壮性更好 ,多线程开销小,效率高,但是不便于资源的保护和管理。多进程相反
  4. 进程有独立的内存,多线程共享这个进程的内存,所以多线程编程极大的提高了程序的运行效率,在多核CPU的系统中多线程可以充分利用CPU多核运算的能力。

关键字

在面试中经常会背问道关键字,如果能答出关键字的所有功能会加分。

const

const关键字最常被问道的功能就是以下几点:

  1. 必须被初始化
  2. const修饰的变量只能被读不能修改
  3. 修饰指针变量时到底是指针变量不可被修改还是指针所指向的内容不可被修改
  4. const修饰成员函数只能调用const成员函数和修改mutable(mutable 是为了突破 const 的限制而设置的)修饰的成员变量,不可以修改普通成员变量

static

static关键字最常被问道的功能就是以下几点:

  1. static变量存储在数据段中,如果没有显示初始化会被自动初始化为0
  2. static修饰局部变量变量只初始化一次,在程序结束时候才释放
  3. static限制内容的作用域,static修饰的全局变量和函数本文件可见,考虑到程序的安全性如果程序中使用全局变量应该优先使用static
  4. static修饰的成员函数和成员变量不new也可以使用(类名.变量名或者类名.方法名),所有该类的对象共有的。
  5. 类的静态成员可以不可以使用类的非静态成员,而类的非静态成员可以使用类的静态成员。
  6. 静态数据成员可以被初始化,但是只能在类体外进行初始化,若未对静态数据成员赋初值,则编译器会自动为其初始化为 0。
  7. 非静态成员函数有 this 指针,而静态成员函数没有 this 指针。

volatile

volatile关键字修饰的变量告诉编译器不要堆该变量进行编译优化,因为随时可能出现变化,如果要对该变量进行操作要从内存中获取改变量的值而不是从寄存器中获取该变量的值。

C/C++

指针

用变量 a 给出下面的定义
a) 一个整型数(An integer)
b)一个指向整型数的指针( A pointer to an integer)
c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to
an intege)r
d)一个有 10 个整型数的数组( An array of 10 integers)
e) 一个有 10 个指针的数组,该指针是指向一个整型数的。 (An array of 10 pointers to
integers)
f) 一个指向有 10 个整型数数组的指针( A pointer to an array of 10 integers)
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a func
tion that takes an integer as an argument and returns an integer)
h)一个有 10 个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型

( An array of ten pointers to functions that take an integer argument and retur
n an integer )
答案是:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument an
d returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integ
er argument and return an integer
数组指针和指针数组的区别:

int *p[4];//指针数组,[]的结合优先于*,代表成员为4个int指针的数组
int (*q)[4];//数组指针代表成员为4个int的数组的指针。指向数组的首地址。

数组指针只是一个指针变量他指向的是一个数组首地址,注意数组指针每次“++”都相当于跳跃了当前的数组长度相当于二维数组每次指针移动就是移动一个一维数组的距离,它占有内存中一个指针的存储空间,指针数组是多个指针变量形成的一个数组,占有多个指针的存储空间。

你可能感兴趣的:(C/C++,c++,面试,linux)