目录
指针变量初始化
如果指针变量没有初始化,此时是随机值。 -----野指针
初始化可以让指针变量 有明确指向。
int a = 10;
int *p = &a;
int *p = NULL(空指针)
int *p,q //p是int *,q是 int 型
int *p,*q;此时表示定义了两个int*类型变量p,q
指针作为函数参数
形参 ---指针类型 变量,用来接收实参(实参是要)
实参 ---要修改谁,就把谁的地址传过去
注意:被调函数中一定要有*p运算// (间接访问操作)
值传递: 只是实参数据,赋值了形参
地址(指针)传递: 通过指针运算,可以实现修改地址内的值
练习:实现两个数求和,通过参数带出
1 #include <stdio.h>
2
3 void sum(int a,int b,int *sum)
4 {
5 *sum = a + b;
6 }
7
8 int main()
9 {
10 int a,b,add;
11
12 a = 6;
13 b = 4;
14
15 sum(a,b,&add);
16
17 printf("sum = %d\n",add);
18
19 return 0;
20 }
~
指针和数组
1.定义一个整型指针变量
int *p = a; ---------- *p = a[0]
itn *p = &a[0];
*(p+i) <==>a[ i ] <==> *(a+i) //等价
i[ a ] <==> *(i+a)
指针的运算
p+1 p-1 p-- p++
指针比较 > >= < <= == !=
1 指针+1 = 原有地址 + sizeof基类型;
2 & 与 * 可以相互抵消;
3 不同的基类型指针相减会编译报错
4 指针之间可以进行减法运算不能做加法运算
5 *要求操作数必须是指针
6.如果int a[ ] , a数组名是个常量,不能做自加运算,自加需要一个左值,可以改变的量
指针实现排序
#include <stdio.h>
void Printf(int *begin,int *end)//打印数组
{
while(begin<end)
{
printf("%2d",*begin++);
}
putchar('\n');
}
void swp(int *a,int *b)//两两数据交换
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void choArray(int *begin,int *end)//选择排序
{
int *p = begin;
int *q = NULL;
for(p=begin;p<end;p++)
{
for(q=p+1;q<end;q++)
{
if(*p>*q)
swp(p,q);
}
}
}
void bubbleArray(int *begin,int *end)//冒泡排序
{
int *p = end;
int *q;
for(p=end;p>begin;p--)
{
for(q=begin;q<p;q++)
{
if(*q>*(q+1))
swp(q,q+1);
}
}
}
void InsertArray(int *begin,int *end)//插入排序
{
int *p = begin;
int *q ;
for(p=begin;p<=end;p++)
{
int t = *p;
q = p;
while(q>begin&&t<*(q-1))
{
*q = *(q-1);
q--;
}
*q = t;
}
}
int *binaryFind(int *begin,int *end,int n)//二分查找
{
int *mid;
int *ret;
while(begin<=end)
{
mid =begin+ (end - begin)/2;
if (*mid>n)
end = mid-1;
else if(*mid<n)
begin = mid+1;
else
{
ret = mid;
break;
}
}
if(begin<end)
return ret;
else
return NULL;
}
int main()
{
int a[] = {9,8,7,6,5,4};
int len = 7;
Printf(a,a+len-1);//打印原数组
// InsertArray(a,a+len-1);
bubbleArray(a,a+len-1);//冒泡排序
Printf(a,a+len-1);//打印排序完后的数组
int *ret = binaryFind(a,a+len-1,len-2);//查看是否找到目标值
printf("ret = %p\n",ret);//打印该值的地址
return 0;
}
快速排序
排序思想: 分而治之
实现思路:
1.找基准值----数组首元素a[ 0 ]
2.end从右边开始找第一个比基准值小的数
3.begin从左边开始,找到比基准值大的第一个数
4.将这两个数进行交换,重复2-4过程,直到begin和end相遇,结束
5.将基准值上的数与begin、end相遇时的位置上的元素进行交换。(此时已经将数组分为左右两边,基准值比左边所有的值都大,比右边所有的值都小)
6.继续对左一半和有一半进行上述快速排序,直至整个数组全部排完。
1 #include <stdio.h>
2 void swap(int *a,int *b);//交换函数
3 void quickSort(int *begin,int *end);
4 {
5 int *p=begin;
6 int *q=end;
7
8 int *k = begin;
9 while(begin<end)
10 {
11 while(begin<end&&*end>=*k)
12 {
13 --end;
14 }
15 while(begin<end&&*begin<=*k)
16 {
17 begin++;
18 }
19 swap(begin,end);
20 }
21 swap(k,begin);
22
23 quickSort(p,end-1);
24 quickSort(begin+1,q);
25 }
26
27 int main()
28 {
29 return 0;
30 }
~