数组与指针的联系
例如,在某个函数的形参里,会有char ptr[100],这时编译器会将它默认看成是char * ptr,在函数里面可以自增,即ptr++。
类似地,char src[3][100]也可以被看做是char *src[100]
//传二维数组,用一维数组指针
//若此时*(src + i),即src[i],是加的100步长
//所以中括号里的100不可以省略,不然不知道步长是多少
由此可见,char src[2][3][100],可看做是char *src[3][100]
值得注意的是,char *ptr[3],可看做是char **ptr
//因为这传的是一个指针数组,所以要将数组里的元素即指针保存起来,一般保存的都是地址,所以要用指针,所以要用指针来保存数组里的指针,即用指针的指针来保存。
//**ptr 有两种解释,一种就是指针变量的地址,一种就是数组指针。
//指针数组里的指针都是野指针,要利用规避野指针的方法来应对
数组与指针的区别
空间分配:
数组:是一种静态分配(静态存储区或栈空间)
指针:是一种动态分配(堆空间)
访问效率
数组:直接访问值(更高)
指针:间接访问值
安全性
数组:可能会出现数组越界(更高)
指针:可能会造成内存泄漏
函数形参
数组:一维数组用指针存放,二维数组用一维指针存放
处理对象
数组:偏向于对值的处理
指针:偏向于对机器数的处理
空间连续性
数组:一定是连续的空间
指针:不一定是连续的空间
常见的内存错误及对策(在重要步骤下printf提示信息或者用gdb来找段错误)
1、内存分配未成功,却使用了他
2、内存分配虽成功,但尚未初始化就引用了他
3、内存分配成功并已初始化,但操作越过了内存的边界
4、忘记释放内存,造成内存泄漏
5、释放了内存却继续使用他