概念
理解:指针主要是为了完成形参去改变实参的值,这种改变主要是通过改变地址和值的对应关系,而不是改变变量的地址的拥有
总结:
一维数组用普通的指针变量,二维数组用数组指针,字符串用字符指针;
指针数组本质是一个数组,类似于字符数组;
引入
为函数修改实参提供支持;
提供另一种访问内存方式;
为动态内存管理提供支持;
为动态数据结构提供支持;
内存地址
字节:内存容量单位,1byte = 8bit
地址:便于内存管理,将内存划分为一个个内存单元(1字节),为区分每一个单元,进行编号
基地址
单字节数据:基地址为其字节编号
多字节数据:基地址为所有字节中编号最小的
空指针
int *p = NULL;
暂时指向一块安全区域,保证系统安全。
野指针
概念:指向一块未知区域
产生原因:
1.指针定义后,未初始化;
int *p;
*p = 200;
2.指针指向内存,被系统收回;
int *p = malloc(200);
free(p); //释放空间,p仍旧指向原来的地址,p会变成野指针
p = NULL; //解决方案,指向零地址
3.指针越界
int a[10];
a[10] = 666; //越界
使用指针变量之前要检验指针变量的有效性
int *p = NULL;
if(!p)
{
return -1;
}
取指与指针
int a = 100, *p = &a;
char c = 'a';
printf("%p%p%d\n", &a, &c, *p);
注意:
不同变量尺寸不同,但地址尺寸(取决于系统的寻址范围)相同;
不同的地址形式上相同,但内部的尺寸和类型不同;