第六天————二级指针,选择排序

***1,二级指针:***

二维数组?—》数组的数组
二级指针?—》指针的指针

概念:二级指针存储的是一级指针的地址
(定义意味着有空间
有空间就会有地址)

格式:
定义一级指针的格式:
存储类型 数据类型 * 指针变量名;

   定义二级指针的格式:
   存储类型  数据类型 **指针变量名;
   分析:
        存储类型:二级指针自身的存储类型
		数据类型**:二级指针的数据类型
		数据类型*:二级指针所指向的类型
		指针变量名:见名知义

在这里插入图片描述

总结:
(1)什么时候需要定义一个二级指针出来?----》当需要该一级指针的值时
(2)如何确定指针的类型?
-----》去掉[变量名] ,剩余的就是该指针自身的类型
eg:
int *p; int *
int *pp; int **
(3)如何确定指针所指向的类型?
----》去掉[
指针变量名] ,剩余的就是该指针所指向的类型
(4)如何分析一个指针一次性访问空间的大小?
----》依赖于所指向的类型
char **pp; pp一次性访问空间的大小为4个
char *p; p一次性访问的空间为1个
int ****pppp;pppp一次性可以访问空间为4个


指针和数组的结合:
指针和一维数组的关系:

指针的算术运算:(+ - * / % ++ --)

假设以p和q为例(注意:p和q是同类型的指针变量)
p + N:代表p向地址增大方向移动N个数据类型的大小(p + sizeof(数据类型) * N)
p - N:代表p向地址减小方向移动N个数据类型的大小(p - sizeof(数据类型) * N)
p++:代表p向地址增大方向移动1个数据类型的大小(p + sizeof(数据类型) * 1)
p–:代表p向地址减小方向移动1个数据类型的大小(p - sizeof(数据类型) * 1)
p-q:代表两个指针之间相隔元素的个数( p - q / sizeof(数据类型))

p++和p+1的区别:
p++《===》 p = p+1;因此,p++会引起指针指向的改变
p+1不会引起指针指向的改变

数组名:
(1)作为数组名,可以代表整个数组
(2)也可以代表数组的首地址

打印输出数组元素的方式:
arr[i] <=> *(arr+i) <=> *(p+i) <=> *(p++) <=> p[i] <=> i[arr] <=> i[p]

分析:可以使用p[i]这种方式来遍历数组的原因是:编译器会自动将p[i]编译成*(p+i)

总结:
对于数组名:arr[i]
对于指针:*(p+i) / *(p++)
在这里插入图片描述

练习:
(1)从键盘获得一个字符串,利用指针实现求该字符串中空格的个数
(2)利用指针实现冒泡(改变指针指向/ 不改变指针指向)

冒泡排序:从左至右,两两依次进行比较

      注意:冒泡按照数据找位置

选择排序:
假设有N个数:
第一趟:找出最大的数,将该数与位置为0的数字进行交换
第二趟:从总个数减1的人数中,再找出最大的时钟与位置为1的数字进行交换。。
。。。。。。。。。。。。

	 注意:选择按照位置找数据

作业:
1,指针实现,定义一个字符串,实现字符串的倒置 “break” —> “kaerb”

#include <stdio.h>

#define M 5
int main(int argc, const char *argv[])
{
	int arr[M] = {0};

	int i;
	for(i=0;i<M;i++)
	{
		scanf("%d",&arr[i]);
	}

	int j;
	//int index;
	//选择排序
	for(i=0;i<M-1;i++)
	{
		//index = i;
		for(j=i+1;j<M;j++)
		{
			/*if(arr[index] > arr[j])
			{
				index = j;
			}
			*/
			if(arr[i] > arr[j])
			{
				int temp;
				temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
		}
		/*
		//交换
		int temp;
		temp = arr[i];
		arr[i] = arr[index];
		arr[index] = temp;
		*/
	}

	printf("排序之后为:\n");
	for(i=0;i<M;i++)
	{
		printf("%d ",arr[i]);
	}
	putchar('\n');
	return 0;
}

2,利用指针实现strcat功能

#include <stdio.h>

int main(int argc, const char *argv[])
{
	char str1[10] = {0};
	char str2[20] = {0};
	char *p=str1;
	char *pp=str2;

	gets(str1);
	gets(str2);

	printf("连接之前: str1  = %s\n",str1);

	int len_str1 = 0,len_str2 = 0;
	int j = 0;
	//先求str1的长度
	while(*(p+j))
	{
		len_str1++;
		j++;
	}

	int i = 0;
	//求str2的长度
	while(*(pp+i))
	{
		len_str2++;
		i++;
	}

	i = 0;
	//判断
	if(10 < (len_str1+len_str2+1))
	{
		printf("error!\n");
		return -1;
	}
	while(*(pp+i))
	{
		*(p+j) =*(pp+i) ;
		i++;
		j++;
	}
	printf("连接之后: str1  = %s\n",p);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值