一.指针的基本概念
指针就是个变量,用来存放地址(地址唯一标识一块内存空间)
指针的大小是固定的4/8个字节(32位平台/64位平台)
指针是有类型的,指针的类型决定了“指针的+-整数的步长”,以及解引用时候的权限
指针之间存在运算
二.理解一级指针,二级指针
指针:即一个指针变量指向一份普通类型的数据,因为指针保存了那个数据的地址,可以通过解引用找到它(p1找到a)
一级指针图示:
2.二级指针传参
二级指针:即一个指针变量指向指针,因为指针保存了那个数据的地址,可以通过两次解引用找到它(p2解引用找到p1,再解引用找到a)
二级指针图示:
精华.二级指针的实际应用场景: 链表的增删查改(逐步探究)
我们可以观察如图所示的情况:
说明:
- pphead是函数SLPushBack中接收plist地址的指针
- 函数SLPuchBack实现的是尾插功能,tail指针变量存储尾指针,newnode是malloc一个新节点以后存储新节点的指针
- 当SLPushBack()函数结束后,会返还空间,此时结构体plist再也找不到在堆上的链表
- 解决方法:一级指针!让plist指向头指针(如果头指针不可被修改)guard
- 但是如果头指针不是哨兵位的头节点(guard),而是可以被删除的结点呢?
- 解决方法:二级指针!每一次调用函数,都会把plist指向头指针
三.字符指针
1.字符指针指向常量字符串
字符指针指向常量字符串原理:指针指向字符串首元素的地址
理解图示:
PS:为满足“常量字符串不可修改”,需改进:“指针前加上const”
*加上const后的数据在内存中存储的情况
编译器从内存优化的角度处理,数据只会存放到同一个地址
2.利用字符指针打印字符串
打印原理:打印字符串只需要首元素地址
1. const char*ps="abcdef"; 2. printf("%s\n",ps);
四.指针数组
指针数组类型:类型 * [ n ]
1.应用:存储字符串组
2.应用:模拟二维数组
五.&数组名 / &数组名[ ] / 数组名
引入:我们知道arr是数组名即首元素地址,那&arr是什么?
结论:
- 除了在sizeof()中,在&arr中,arr(数组名)指的不是数组首元素的地址
- &arr的类型是数组指针(例:int(*pa)[10])
- &arr[0]与arr的类型是指针(例:int*)
六.指针类型决定步长(演示)
要点:&arr取出的是整个数组的地址,+1后则跳过整个数组