- 写这篇文章的起因是 参加了一个公司的笔试 发现考的都是很细节的东西 所以在学习中遇到这样的问题就记录一下.
1.指针在申请/释放后置NULL 防止野指针;
2. delete一个不是new出来的地址会导致堆破坏;
3.WIN7上系统自带程序 入regedit或calc taskmgr 弹出错误对话框的函数是DialogBoxIndrectParamW;
4.务必检测内存分布失败情况malloc ExAlloc
5.() > [] > *
例子:
int *a[10];[] > * 所以是数组 什么类型的数组 *指针 即指针数组
int (*a)[10]; () > [] 所以是指针 什么类型是指针 [10]数组 级数组指针;
int (*a[10])(int); []>*为数组 类型是指针数组 后面还加函数 即函数指针数组
6:字符数组如果不是用花括 初始化的sizeof这个数组为字符个数+1 反之不加(即用花括 初始化的sizeof为元素个数)
7:strlen计算字符串有效字符数不包含 在申请时需要+1
8:数组做函数参数时,在函数体内计算该数组参数等同于计算指针的长度 在32位下指针长度为4 64位下为8
这种情况是算指针的长度int *a = new int[50]; sizeof(a) = 4;
9:计算数组长度时,如果函数作为函数的参数,将退化为指针,其长度为指针的长度 这个同8
例子:
10:数组名和取数组地址是一样的 但两个含义不同
比如int a[2]
a为int类型 &a为a[2]的类型
在a+1 &a+1时 一个是地址+4 一个是地址+整个数组的大小
不比如:int a[5][10]
a是 int a[10]类型 &a是a[5][10]类型(a总是最后一个下标的类型(如果不是多维数组为类型的类型如上))
抽象的说 如果定义一个数组 int a[M1][M2][M3][…][Mn]
那么a+1 = a的首地址 + m2*m3*m4*…*Mn*sizeof(int);
那么&a+1 = a的首地址 + m1*m2*m3*m4*…*Mn*sizeof(int);
11.得到结构体中某个数据的偏移 可以这么做 将0强制转换成结构指针 然后获取成员指针 然后转换成size_t就是偏移了
定义这么一个宏
12.与(&)运算 取位操作例如一个数&1的结果就是取最末位,这可以用来判断一个整数的奇偶 如果末位为0则偶反正为奇
两个都是1时为1 反则为0;
13.或(|)用于二进制特定位上的无条件赋值 列入一个数 | 1 的结果就是把二进制最末位强行变成1
如果要将最末位置0 对这个数 | 1之后 再减1就可以了
14.异或 ^ 相同为假,不同为真 也是逆运算
15.取反~ 运算 对一个无符 整数(不能表示负数)值取反 得到的是它与该类型上界的差
16.左移
17.右移>> a >> b表示把二进制a 右移 b位(去掉末b位) 相当于a处于2的b次方(取整)
18.指针末尾
已知首地址 求末地址
pStare
pEnd = pStare + N -1
pEnd = pStare + strlen(str) – 1;
19.用户态传进来的东西严格检查并要自己复制一份!
20.内核不要使用递归!内核不要使用递归!内核不要使用递归!(虽然微软自己使用了递归InternalBuildHwndList)
21.内核字符串局部变量最好不要用数组定义!比如WCHAR[MAX_PATH]!内核栈太小啦!
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!