C/c++常见面试题

【C语言部分】

一、概念问答题:


1、static在C和C++里各代表什么含义 (语言)
解析:
1、static主要修饰变量、函数、成员变量和成员函数
2、修饰变量表明变量的生存周期,生存周期随进程,进程结束才结束
3、修饰函数,表明函数的作用域只限于本文件使用
4、修饰成员变量和成员函数只针对于C++才有,也表示生存周期和作用域
5、static修饰的变量默认被初始化成0
6、static修饰的变量在函数里只会被初始化一次

2、const在C/C++里什么意思(语言)
解析:
1、const在c/c++中都可以用来修饰变量,在c语言中修饰的是一个只读变量、在C++中修饰的是一个常量
2、都可以修饰函数,在c语言中修饰函数的返回值,但在C++中即可以修饰返回值也可以修饰成常函数
3、修饰指针,放在*前面修指针指向我值为常量,放在*后修饰指针为常量地址
4、修饰形参,保证传如函数的值不被改变

3、volatile关键的作用(语言)
解析:
1、volatile本意是指易变的,所以一般用它来修饰变量来保证每次取值都是从内存中取而不是在寄存器中取,一般比较用在多线程中

4、new&delete 和malloc&free的区别
解析:
1、new和delete是C++用来内存分配和释放的操作符,malloc和free是C语言用来分配和释放内存的函数
2、new和delete一般可以使用malloc和free来作为底层实现,而且new分配内存不需要显示的计算大小传入,而malloc则必须要而且malloc的返回值为void*,所以一般申请后的空间需要强制类型转化
3、malloc底层实现靠mmap和brk来实现,大块的内存申请用mmap直接映射来提高效率,小块的内存靠brk来分配,也可以用sbrk来实现,但sbrk底层也还是调的brk,brk传入的是偏移量大小,sbrk传入的是需要分配的地址空间
4、new申请空间会调构造函数malloc不会,delete会调析构函数free不会
5、new申请空间失败会抛出异常,malloc申请空间失败返回NULL
6、new有定位符new,而且new可以通过operator new来进行重载

5、随便写一个函数指针、指针数组和数 组指针
解析:
1、函数指针:int (*ptr)();
2、指针数组:int *ptr[];
3、数组指针:int (*ptr)[]

6、你觉得指针和数组相同吗?讲讲你理解的指针。
解析:
1、肯定不同,指针是一块地址,而数组的分配在栈空间上的一块连续的地址,虽然他们都是指的地址,但他们的意义不同
2、指针分为两块,一是指针本身的地址,二是指针指向的地址,指针本身的地址是定义在栈上的一块地址,但这快地址里不能村数据,例如:int *p;p本身是在栈上存在的地址,但不能这样使用*p=10;而指针指向的地址可以是在栈上也可以在堆上开辟,
3、当数组做函数参数的时候会退化成指针



7、const和#define有什么不同?
解析:
1、const在c语言中修饰的是只读变量,在c++中修饰的是常量
2、const对类型安全进行检查,#define只是在编译的时候进行宏替换

8、给我讲解你理解的结构体内存对齐。
解析:
1、在32位操作系统下系统默认是按4字节对齐,即如果变量类型小于4的话就补齐4位,最后在计算整个结构体大小的时候算出来的结果也需要是4的整数倍,如果不是则补齐
2、为了提高数据读取效率才设置以时间换空间的方法来进行内存对齐

9、对比一下strlen和sizeof。
解析:
1、strlen是求字符串的大小,并且以'\0'结束标记,而sizeof求空间大小,它不管什么类型都可以求而strlen只适合字符串
2、strlen是函数,sizeof是运算符
3、strlen在运行的时候确定,sizeof在编译的时候就确定了
4、sizeof只是求出当前结果,不会对数据有任何改动,例如int i=10;sizeof(i++);最后i还是等于10



你可能感兴趣的:(code---c语言,code--C/C++专栏)