野指针:未初始化的指针
int *p = NULL;//空指针,地址为0
指针赋值:
int *p;
p = NULL;
int *p,*q;//表示定义多个指针变量
int *p,q;//p是指针类型,q是int类型
为什么需要指针?因为可以被调修改主调
要实现被调修改主调:
指针作为函数参数
形参:指针类型变量,用来接收实参(实参是要访问的内存空间的地址)
实参:要修改谁,就把谁的地址传过去
注意:被调函数中一定要有 *p运算
值传递:只是实参数据赋值了形参
地址传递:要改变的变量要传地址过来,但是要保证空间有效
*p 间接访问的步骤:
1.首先拿出p中的地址到内存中定位
2.偏移出基类型大小的一块空间
3.将偏移出的这块空间当作一个基类型变量来看
指针+一维数组
1.定义指针变量
int *p = a;//数组名a代表的是数组的首地址,表示p指向数组a
int *p = &a[0];
数组名是常量,不可进行运算操作
指针的运算:
&
*
p + 1 //表示跳过了1个基类型
p - 1
p++
p--
指针比较:
p - q //表示相差几个基类型且是同一类型的指针
p + q p *q p/q //无实际意义,会报错
int a[5];
int *p = &a[0];
* &可以抵消 *&p = p
但是&*p 为a[0]的值的地址
*(p + i) <=> a[i] <=>*(a + i)
a[i] = *(a + i)
i[a] = *(i + a)
数组作为函数参数
形参:数组形式//本质上是一个指针类型变量
实参:
快速排序的实现思路:
1.将数组首元素a[0]作为基准值,首位地址为begin,末位地址为end
2.end从右边开始找,找到第一个比基准值小的数字
3.begin从左边找,找到第一个比基准值大的数字
4.将找到的这两个数字交换
重复2~4的过程,直到begin与end相遇,此时结束
5.将基准位置上的值与此时begin.end上的值交换
6.继续对基准值左一半和右一半分别快速排序