关于指针:
一维指针保存基本变量的地址
二维指针保存一维指针变量的地址
三维指针保存二维指针变量的地址
关于传参:
传一维数组名,用数组元素的指针来接
传二维数组名,用一维数组的指针来接
传三维数组名,用二维数组的指针来接
传指针数组,用指针的指针接
关于数组名:
一维数组名:指针常量,指向数组首元素的地址
二维数组名:首个一维数组的地址(首行的地址)
三维数组名:首个二维数组的地址
如何避免野指针(养成良好的编程习惯):
1、当定义一个指针,且该指针没有指向时,将其置为空。
2、当要往指针指向的空间赋值时,先看是否给它分配了合法的空间。
取值和取地址:
&a;
*(&a) == a;
1、对一维数组的数组名取地址等于数组的地址。
对一维数组的地址取值等于数组首元素的地址。
2、对二维数组的数组名取地址等于二维数组的地址。
对二维数组的地址取值等于首个一维数组的地址。
3、对三维数组的数组名取地址等于三维数组的地址。
对三维数组的地址取值等于首个二维数组的地址。
数组与指针的区别(主要):
| 数组 | 指针 |
空间分配 | 静态分配 | 动态分配 |
访问效率 | 直接访问,效率高 | 间接访问,效率低 |
安全性 | 数据越界 | 内存泄漏 |
函数形参 | 都转化成相应的指针 |
你的数据放在哪里:
栈(stack):局部变量、函数形参、自动变量
堆(heap):malloc、realloc、calloc分配的空间
数据区(.bss段):未初始化的全局变量
数据区(.data段)(静态数据区):初始化过的全局变量、静态static修饰的变量
数据区(.rodata段):常量数据
代码段(.text段):代码
常见的内存错误及应对:
1、内存分配未成功,却使用了它。
应对:在使用之前检查内存是否分配成功。可以在使用内存之前检查指针是否为NULL,若分配成功便可以使用,否则打印错误信息并退出程序。
2、内存虽然分配成功,但是尚未初始化就引用它。
应对:
①注意赋初值
②在检查内存分配成功之后,先用memset或bzero函数清空分配好的内存空间原来的数据。
3、内存分配成功并且已经初始化,但操作越过了内存边界。
应对:在使用数组时,注意是否操作越界。有没有下标“多1”或“少1”的操作,特别要注意循环。
4、忘记了释放内存,造成内存泄漏。
应对:用完了动态内存之后一定要释放。动态内存的申请与释放必须配对,程序中malloc与free的使用次数一定要相同,new/delete同理。
5、释放了内存却继续使用它。
应对:释放完内存之后要及时将指针置空。