1.递归与斐波那契数列->特点是:后一项等于前两项的和。————引申为前后项有固定关系
2.C99支持数组下标为参数,C11不支持(vs2022说的就是你)
还有:scanf 数组时也要加&
3.写出来一个东西,不要满足于能运行,有结果,想想能不能优化。
底层程序员确实不需要思考这些,但是你想成就高些,理应做到这件事
3.
指针
1.&a(int)-->首字节的地址
2.x86->4字节 x64->8字节
3.sizeof返回的类型是无符号类型,->unsigned int->用%u接受
4.存十六进制的时候一个十六进制对应四个二进制位,两个十六进制数占用一个字节如0x11-->00010001
5.强制类型转换:int a=0; (char)a ;即可
6.为什么指针变量大小相同但是却要分开写
1..char* int* double*不同类型的指针大小相同,但解引用时有所不同,如:
int a = 0;(a有四个字节)
char* p = &a
对*p操作时,只会改变a的一个字节
float* p = &a
对*p操作时,以浮点数的形式更改变量
2..指针变量的类型决定了对指针变量加减时它的变化幅度,
int*类型+1,跳过四个字节; char*为1;
可以把这项特性当作工具来使用,使内存访问更加方便(自由决定跳过几个字节以访问想访问的地址)
7.指针变量用%p接受
8.野指针
为初始化的指针变量,无法调用的指针变量
特殊情况:一个指针变量存的是一个已经销毁的变量的地址,这种情况相当不稳定,非法的
如何规避
补充
数组赋值的新方法
9.指针变量相减得到的是两个地址之间的元素个数
适用于:同一数组,相同类型的指针
10.标准细节(内存开辟是从高到低,低地址被用过,可能有问题
补充
11.二级指针int**
分开理解: int 和 *; int* 和 *
双层调用:**ppa才能对a进行操作
12.指针数组
存指针的数组
把*(parr[i])拆开来看从内到外逐层分析:
parr[i]表示*(parr + i),得到指针变量,
*(parr[i])对得到的指针变量再次解引用,得到变量本身
arr[i] ==>*(arr + i)(arr[]本身就表示一次解引用,arr本身就代表地址)