说明:
- 面试群,群号: 228447240
- 面试题来源于网络书籍,公司题目以及博主原创或修改(题目大部分来源于各种公司);
- 文中很多题目,或许大家直接编译器写完,1分钟就出结果了。但在这里博主希望每一个题目,大家都要经过认真思考,答案不重要,重要的是通过题目理解所考知识点,好应对题目更多的变化;
- 博主与大家一起学习,一起刷题,共同进步;
- 写文不易,麻烦给个三连!!!
前面1-15已经是C/C++,但是由于前面写的比较混乱,把八股文和题目混在了一起,所以从这一篇开始重新整理重新写,前面1-15也就可以选看了,希望多多支持!
1.指针常量、常量指针、指向常量的常量指针
答案:
1.const int* p //常量指针------>指针指向的地址的内容不可以改变
2.Int const *p //常量指针
3.Int * const p // 指针常量------>指针指向的地址可以不改变
4.const int * const p //指向常量的常量指针------>指针指向的地址和指向的内容都不可以改变
2.使用指针的好处
答案:
1.指针可以动态分配内存
2.在链表中可以方便修改链表的节点
3.解析字符串
4.相同类型的指针可以直接复制
3.指针和引用的异同,如何转换
答案:
1.都是指针的概念,指针保存的是内存的地址,引用是某块内存的别名,这个内存一旦初始化就不能再去指向别的内存
2.两者都会占用内存
区别:
- 指针是实体,而引用是别名
- 引用的本质是指针常量,指向指针的地址不可以改变,指向地址的内容可以改变
- 自增表示的意义不同,指针自增表示地址自增,引用表示值自增
- 引用必须初始化
- 引用不能为空
- sizeof(引用)得到的是所指向的变量的大小,sizeof(指针)的到的是指针大小
- 引用不需要解引用
转换:
- 指针转引用:把指针用*就可以转换成对象,可以用在引用参数当中
- 引用转指针:把引用类型的对象用&取地址就获得指针了
4.二维数组
答案:
int a[3][3];
1.int a[3][3];表示是个三行三列的二维数组
2.数组名表示数组首元素的地址,即第0行第0个地址
3.a+1表示地址偏移一个一维数组的地址,即三列*int大小=3*4 = 12
4.*a 表示去二维变一维,*a就相当于一维数组的数组名,比如 *a +1 表示第0行下标为1的元素地址,只是偏移一个Int地址
5.若要表示a[2][2]的元素 即 *(*(a+2)+2)
//解释:
a+2表示偏移2个一维数组, 地址
*(a+2)表示去二维变一维数组 地址
*(*(a+2)+2) 表示在一维的基础上偏移两个元素 数值
6.a[0] + 1// 相当于一维数组移动一个int地址,比如表示a[2][2]元素 *(a[2] + 2)
对于二维字符数组的初始化
char str[][2] ={“h”,”h”};
字符二维数组的初始化不能是字符,要是字符串
5.数组初始化
答案:
对于二维数组可以
Int num[][10] 第一个[]可以不填,但是第二个必须填,但是这个数组必须初始化
对于一维数组
Int num[] 这[]可以不填但是这个数组必须初始化
总结:
数组的最左边的[]可以不填,这个时候数组必须初始化,二维数组的第二个[]必须填,不管有没有初始化
6.调用Free释放内存后,指针还能用吗
答案:
Free释放掉内存后,只是把内存的使用权就被归还给系统,内存里面的东西可能被清除也可能是垃圾值,但是指向这个内存的指针还是指向这块内存,并不会NULL。
7.函数指针
答案:
int (*pf)(int)
函数指针调用函数事注意以下几点:
- 函数类型必须和函数指针的类型一样,比如参数类型,返回值
- 给函数指针赋值是可以&也可以不要
8.指针不能加指针
答案:
指针之间可以做减法,但不能做加法。
9.空指针的指向哪里
答案:
空指针是指指向地址为0的地方。
10.数组声明和引用的下标
答案:
声明下标只能是常量;
引用下标可以是整形常量,整形表达式,整形变量。
11.预处理器标识#error的目的是什么?
答案:
编译程序时,只要遇到#error就会生成一个编译错误提醒,并且停止编译。
语法格式:
#error error-message
实例:
#ifdef xxx
#error “xxx has been defined”
#else
#endif
12.头文件中 #ifndef #define #endif
答案:
当项目中有多个c文件使用到同一个头文件是,在编译的时候会出现大量的变量,函数声明冲突,解决就是使用。
#ifndef _HEAR_H_
#define _HEAR_H_
#endif
说可以是自由命名的,但每个头文件的这个"标识"都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的 "." 也变成下划线,如stdio.h。