目录
指针
指针变量的初始化
如果指针变量没有初始化,此时是随机值。---> 野指针
初始化可以让指针变量有明确指向
int *p;
int *p = NULL; // NULL为0号地址 简称空指针
赋值
int a = 10;
int *p;
p = &a;
//定义多个指针类型变量时有多少个指针,就写多少个*
int *p,q; //此时p是指针类型,q是int类型
int *p,*q; //此时p和q是指针类型
指针的作用
被调修改主调
指针作为函数的参数
形参:是指针类型的变量,用来接收实参(实参是要操作的内存空间的地址)
实参:要修改谁,就把谁的地址传过去。要保证地址有效,不能是野指针。
注意:被调函数中一定要有*p运算(间接访问的操作)
#include <stdio.h>
int addOne(int *p)
{
*p = *p + 1;
return *p
}
int main()
{
int n = 1;
int ret = addOne(&n);
printf("n = %d\n",n);
return 0;
}
指针操作数组
指针+一维整型数组
int a[5]; //数组名代表数据类型和数组首元素的地址
int *p = a;
int *p = &a[0];
1.定义一个什么类型的指针变量?——int *类型
2.谁能代表数组所在空间的首地址?—— 数组名
这个地址值的类型 a <=> &a[0]; a[0]的数据类型为int型,所以&a[0]是int *类型
补充:指针相关的运算:& * p+1 p-1 p++ p-- 比较运算。
p + n表示跳过了n个基类型;
p - n表示回退了n个基类型;
两个指针也可以做减法,表示两个指针差多少个元素(基类型),前提是两个指针是同一类型的指针。但是一定不能做加法
形参:指针类型的变量+数组长度
实参:传数组名(数组的首地址)+ 数组长度
迭代操作
传参时不传入数组长度,而是传入结束的地址。
//举例:找到一个一维数组中的最大值
#include <stdio.h>
int findMax(int *begin,int *end)
{
int max = *begin;
while (begin < end)
{
if (*begin > max)
{
max = *begin;
}
begin++;
}
return;
}
int main()
{
int a[] = {1,3,6,9,1,2};
int len = sizeof(a) / sizeof(a[0]);
int max = findMax(a,a+len-1);
printf("max = %d\n",max);
return 0;
}
快速排序
1.将数组第一个元素作为基准点
2.从数组结束位置往回找,找到第一个比基准点的值还小的数记住位置
3.从数组开头往后找,找到第一个比基准点大的数 ,记录位置
4.将两个位置上的数进行交换,然后进行下一次1-4的步骤
5.当两头相向而行时遇到一起时,记录遇到的位置,将基准点上的值与该位置上的值交换。
6.此时将数组分为三个部分,前半区,第一轮完成后begin和end相遇的地方,后半区
7.调用函数分别对前半区和后半区进行1-5的步骤,直到开始和结束位置错开。
void quickSort(int *begin,int *end)
{
int *p = begin; //记录刚开始时的开始位置
int *q = end; //记录开始时的结束位置 //这两个位置为前后半区分别提供了开始和结束位置
int *mark = begin; //将第一个位置做基准点
if (begin >= end)
{
return; //刚开始begin和end就错开,直接结束排序
}
while (begin < end) //找到begin和end相遇的位置
{
while (begin < end && *end > *mark) //如果没从后面找到一个比基准点小的值,则一致向前找
{
end--;
}
while (begin < end && *begin < *mark) //如果没从前面找到一个比基准点大的值,则一致向后找
{
begin++;
}
swap(begin,end); //从前面找到一个比基准点的值大的位置,从后面找到一个比基准点的值小的位置,交换两个位置的值。
}
swap(mark,begin); //begin和end相遇,表示找到一个位置,前面都比他小,都比他大,交换这个位置。
quickSort(p,end-1); //对前半区进行快速排序,开始位置为第一个,结束位置是从begin和end相遇位置的前一个。
quickSort(begin+1,q); //对后半区进行快速排序,开始位置为begin和end相遇位置的后一个,结束位置为最后一个
}