指针(2)

目录

指针变量初始化

指针和数组

指针的运算

指针实现排序

快速排序


指针变量初始化

        如果指针变量没有初始化,此时是随机值。  -----野指针

        初始化可以让指针变量 有明确指向。

        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 }
~      

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值