认识指针
概念
(1).指针概念
指针 就是 地址
地址 就是 内存单元的编号
代表的意义:
地址 只是 告诉了说 在哪里
(2).指针类型
地址 本身 是一种特殊的数据 --- 是具有指向含义的 整数
c语言为了能够表示这种特殊的数据
专门设计一种数据类型 --- 指针类型
定义
语法:
基类型 * 指针变量名;
(1)基类型
基类型说明了 通过指针 找到的空间
a.多大
b.怎么用
就是 指针找到的空间上 所存储的 数据类型
(2) *
只是一个修饰符
用来说明现在定义的变量,不是普通变量,而是指针变量
(3)指针变量名
是个标识符 ,符合标识符命名规则
定义多个指针变量:
int *p1,*p2,*p3; //*用来修饰变量名
理解
指针就是地址,地址就是内存单元的编号,通过指针能且仅能 找到该地址对应的空间
指针是一种数据类型,这种类型定义的指针变量里面,存储着地址数据。
地址 是 内存单元的编号 -- 就是编号本身
记录地址的指示牌 --- 相当于是指针变量
通过指针变量(指示牌) ---获得地址信息
|----告诉说在哪里
通过指针引用数据
通过指针仅仅只能找到地址对应的空间,但如果想要访问这个空间,
还必须使用指针运算符 *
* 地址数据
作用:
表示使用地址所在的空间。
int a=10;
int *p=&a;
*p
*p 表示使用 a的空间,对*p的操作就相当于对a的操作。
此时a的空间两种使用方式
1.通过a直接使用 --- 直接访问
2.通过p来使用 --- 通过p拿到地址值 ,再对地址做*运算 ,才能使用到a的空间 ——间接访问
*p的运算过程:
1.从p中拿到地址值,到内存中找到对应的空间
2.从定位处开始偏移基类型大小sizeof(基类型)的一块空间
3.把这块空间当作一个基类型的变量/数据看待
用途
a.可以使函数带出多个结果 //指针间接访问
b.提高效率 函数传参 避免了大数据的拷贝
c.在被调函数中,实现对主调函数中数据的使用和修改
想要实现 被调 修改 主调
a.要修改谁 就把谁的地址传过去
b.被调函数中,还必须有对应的 *p 这样运算
函数传参的方式:
值传递 --- 实参的值 给到 形参变量
地址传递 --- 可以实现被调修改主调
特殊的指针
NULL ---空指针 --- 地址编号为 0 的地址
野指针(没有初始化的指针)--- 野指针 需要避免出现---指向不明确---可能指向可用空间,也可能指向不可用空间从而报错
指针与数组
指针的运算
算术运算
关系运算
看的就是指针的数值 地址编号大的 就大
> >= < <= == !=
p1 == &m
考点:判断大小端
int *isList(void)
{
int a=1;
char *p=(char *)&a;
return *p;
}
int main()
{
if(isList())
printf("小端");
else
printf("大端");
}
指针操作数组
数组的特点:
连续 有序 单一
操作数组 --- 只需要获得首元素的地址即可
*(p+i) <=> a[i]
a[i] //数组下标的方式 --- 其实本质就是 指针的运算
i[a] // *(i+p)
说明:
指针操作数组 --- 只需要获得 首元素地址即可
迭代 从上一个 推到 下一个
快速排序
在四种排序中效果最好。
需要用到指针,函数,递归。
step1: 找一个基准值
//数组的第一个元素
step2: 从右往左 开始找 第一个比 基准值 小 的值
step3: 从左往右 开始找 第一个比 基准值 大 的值
step4: 交换找到值,重复step2 到 step4
直到begin 和 end相遇
step5: 相遇后,将相遇位置上的值 与 基准值 交换
step6: 对小的一部分 继续快速排序
对大的一部分 继续快速排序
void QuickSort(int *begin,int *end)
177 {
178 int *p=begin;
179 int *q=end; //记录进入函数时的begin和end
180
181 int *k=begin; //基准值
182
183 if(begin>=end) //结束条件
184 {
185 return ;
186 }
187
188 while(begin<end) //不一定只有一个值,寻找的循环,结束条件
189 {
190 while(begin<end&&*end>=*k) //从右至左找小值
191 {
192 end--;
193 }
194
195 while(begin<end&&*begin<=*k) //从左至右找大值
196 {
197 begin++;
198 }
199
200 swap(end,begin); //交换两值
201 }
202
203 if(begin==end) //当begin和end相遇时,交换begin位置的值和基准值
204 swap(begin,k);
205
206 QuickSort(p,end-1); //对小的部分继续快速排序,函数的递归
207 QuickSort(begin+1,q);//对大的部分继续快速排序,函数的递归
208 }