嵌入式学习第十三天 —— 指针的使用

指针变量的初始化

  如果指针变量没有初始化,此时是随机值  --- 野指针
  初始化可以让指针变量有明确指向
  初始化方式
  int a=10;
  int *p = &a;
  int *p = NULL; //0号数组 -- 空指针

  赋值
  int *p;
  p = NULL;

  int *p,q; //p是指针类型 Int*,q是int型
  int* p,q; //此时表示定义了两个int*类型的变量p和q
        //注意:定义的时候*修饰变量名的表示定义的是一个指针类型的变量

指针的使用

学了指针类型,那为什么需要指针类型呢?

  可以实现被调修改主调  //指针80%的用途

要实现被调修改主调

指针作为函数参数

  形参 -- 指针类型变量,用来接收实参(实参是要操作的内存空间的地址)
  实参 -- 要修改谁,就把谁的地址传过去 //要不在空间有效
          注意:被调函数中一定要有*p运算
  值传递        //只是实参数据赋值给了形参
  地址(指针)传递    //传的是地址,可以实现被调修改主调

指针+一维整型数组

1.定义一个什么类型的指针变量?
    int *p = a;        //p指向数组a 
    int *p = &a[0];
2.谁能代表数组所在空间的首地址?
    数组名 -- 数组首元素的地址

这个地址值的类型  
   a <=>  &a[0] 
          //a[0]的数据类型 -- int型 
          //&a[0]  地址的类型 -- int *      
    int *p = a; //表示 p指向数组a 
    *p  <=> a[0] 

指针的运算

int a[10];
int *p = a;
int *q = a + 9;
p+1    //跳过了n个基类型
p-1
p++
p--
p - q     //表示差了多少元素(基类型)
          //必须是同一类型的指针            
p + q     //不行 
由数组和指针的运算可得
*(p+i) <=> a[i] <=> *(a+i)

数组作为函数参数

  形参 -- 数组形式 //本质上是一个指针类型变量
 
  实参 -- 数组名   //数组名代表首地址

用指针的迭代写排序查找

选择排序

void choieSort(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)
			{
				swap(p,q);
			}
		}
	}
}

冒泡排序 

 

void bullueSort(int *begin,int *end)
{
	int *p = begin;
	int *q = NULL;
	int *t = end;
	for(p = begin;p < t;p++)
	{
		end--;
		for(q = begin;q <= end;q++)
		{
			if(*q > *(q+1))
			{
				swap(q,q+1);
			}
		}
	}
}

插入排序

void insert(int *begin,int *end)
{
	int *q = begin;
	begin++;
	while(begin <= end)
	{
		int t = *begin;
		int *p = begin;
		while(t < *(p-1)&& p > q)
		{
			*p = *(p-1);
			--p;
		}
		*p = t;
		begin++;
	}
}

二分查找

int * binaryFind(int *begin,int *end,int n)
{
	int *mid = NULL;
	int *ret = NULL;
	mid = begin + (end - begin) / 2;
	if(begin > end)
	{
		return ret;
	}
	else
	{
		if(*mid > n)
		{
			end = mid - 1;
		}
		else if(*mid < n)
		{
			begin = mid + 1;
		}
		else
		{
			ret = mid;
			return ret;
		}
	return binaryFind(begin,end,n);
	}

}

 二分查找中不但使用了指针,还用了前两天所学的递归

 

用指针实现快速排序

快速排序思想:快速排序的基本思想是从一组数据中选取一个基准值(通常取第一个元素),然后比较其他元素与基准值的关系,将数组划分为两部分:一部分包含所有小于基准值的元素,另一部分则包含所有大于或等于基准值的元素。之后,我们分别对这两部分重复这个过程,直到最终所有的元素都排列在它们应该的位置上。

void swap(int *a,int *b)
{
	int t = *a;
	*a = *b;
	*b = t;
}
void quickSort(int *begin,int *end)
{
	int *p = begin;
	int *q = end;

	int *k = begin;

	if(begin>=end)
	{
		return ;
	}
	else
	{
		while(begin < end)
		{
			while(begin < end && *end >= *k)
			{
				--end;
			}
			while(begin < end && *begin <= *k)
			{
				begin++;
			}
			swap(begin,end);
		}
		swap(k,begin);
		quickSort(p,end-1);
		quickSort(begin+1,q);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值