一,指针是什么?
指针理解的两个要点:
1,指针是内存中一个最小单元的编号,也就是地址
2,平时口语中说的指针通常指的是指针变量,是用来存放地址的指针变量
总结:指针就是地址,口语说的指针其实就是指针变量
eg:
int a=10; //是向内存中栈区空间申请了4个字节,用来存放10这个元素那如何编址呢?
总结:
1,内存被划分成一个个内存单元,每个内存单元的大小是1个字节
2,每个字节的内存单元都有1个编号,这个编号就是地址,地址在c语言中称为指针
3,地址要存储的话,存放在指针变量中
4,每个内存单元都有唯一的地址来标识
5,在32位机器上的地址大小是4个字节,所以指针变量的大小也是四个字节
同理:在64位机器上的地址大小是8个字节,所以指针变量的大小也 8个字节
2,指针类型
总结:
1指针类型是有用的,指针类型决定着指针进行解引用操作的时候访问几个字节
由此看出,指针类型是有意义的,指针类型决定了指针+1/-1跳过几个字节
int* 的指针+1,跳过4个字节
char* 的指针+1,跳过1个字节
short* 的指针+1,跳过2个字节
double* 的指针+1,跳过8个字节
3,野指针
ox11223344是凭空捏造的地址,(比如随便编个号码去打电话,结果是不存在的)
指针变量没有被初始化的时候,就是一个野指针
eg:1
2*p=-1;p++其实等价与*(p++)=-1
3
4如何规避野指针
1,指针初始化(如果明确指针应该指向哪里,就初始化地址。eg:int a=10;int* p=&a;)
如果指针不知道初始化什么值,为了安全,初始化NULL(int *p=NULL)
NULL------0
0作为地址时,这个地址用户程序是不能访问的
2,小心指针越界
3,指针指向空间释放,及时NULL
4,避免返回局部变量的地址
5,指针使用之前检查有效性
5,指针运算
1 指针+-整数
标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较
2 指针-指针运算
指针-指针的前提是;两个指针指向同一块区域,指针类型是相同的
指针-指针的绝对值 得到的是两个元素之间的元素个数
模拟实现字符串的长度
1计数器 2,递归
数组和指针的知识点对比:
6,二级指针 (存放一级指针变量的地址)
七指针数组
字符数组:存放字符的数组
整型数组:存放整型的数组
指针数组:存放指针(地址)的数组
使用指针数组,模拟一个二维数组(但本质不是二维数组,只是有二维数组的效果)