讲解指向指针的指针传值原理。

#include <stdio.h>
#include <stdlib.h>
#define n 7
/* 用指向指针的指针的方法对n个整数排序并且输出。
要求将排序单独写成一个函数,n个整数在主函数中输入,最后在主函数中输出 */

int main(int argc, char *argv[]) {
	int **p,*str[n],arr[n];                        //定义的是整型变量,而不是字符型变量  
	int i;                                    //定 义 循 环 变 量 i 
	for(i=0;i<n;++i)
	{
		str[i]=&arr[i];             //将数组进行逐个的赋值,arr[i]的行的首地址存放在str[i]中。 
	}
	//输入
	printf("input");
	for(i=0;i<n;i++)
	{
		scanf("%d",str[i]);
	}
	// 调用sort函数进行排序 
	sort(str);
	for(i=0;i<n;++i)
	{
		printf("%d  ",*str[i]); //逐个进行输出 
	} 
	return 0;
}
void sort(int **p)    //采用的是冒泡的方法进行的排序
{
	int i,j; 
	int temp;
	for(i=1;i<n;++i)
	{
		for(j=0;j<n-i;++j)
		{
			if(**(p+j+1)<**(p+j))
			{
				temp=**(p+j+1);
				**(p+j+1)=**(p+j);
				**(p+j)=temp;
			}
		}
	}
	return 0;
}

画图的方式说明原理:NO.1


第二种方法传地址:

void sort(int **p)    //采用的是冒泡的方法进行的排序
{
	int i,j; 
	int *temp;
	for(i=1;i<n;++i)
	{
		for(j=0;j<n-i;++j)
		{
			if(**(p+j+1)<**(p+j))
			{
				temp=*(p+j+1);
				*(p+j+1)=*(p+j);
				*(p+j)=temp;
			}
		}
	}
	return 0;
}

画图的方式说明原理:NO.2




运行结果:



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define n 5
/* 指向指针的指针的方法n个字符串排序并输出*/

int main(int argc, char *argv[]) {
	void sort(char **p);
	char **p,*str[n],arr[n][20]; 
	int i;
	for(i=0;i<n;i++)
	{
		str[i]=arr[i];
	}
	// input
	printf("input:\n"); 
	for(i=0;i<n;i++)
	{
	   scanf("%s",str[i]);	
	}
	// call the function 
	p=str;
	sort(p);
	//output
	printf("output:\n"); 
	for(i=0;i<n;++i)
	{
		printf("%s\n",str[i]);//调用  此处仍然是行的首地址,为指针,注意了! 
	}
	return 0;
}
void sort(char **p) //采用的是冒泡排序,地址的交换
{
	int i;
	int j;
	char s[20];//为什么要交换地址,因为是字符串,字符串并不能用以下的方法来交换 
	for(i=1;i<n;++i)
	{
		for(j=0;j<n-i;++j)
		{
			if(strcmp(p[j],p[j+1])>0) // 记得字符串比较函数,1、实参是输入的地址如char *a,*b;2、 strcmp(a,b); 
			{
					strcpy(s,p[j]);
					strcpy(p[j],p[j+1]);
					strcpy(p[j+1],s);// 记得交换字符串 
			}
		}
	}
}



/*关于sort()部分,下面为两种方法进行交换字符串  NO2. 
void sort(char **p) //采用strcpy一定要保证是 
{
	int i;
	int j;
	char *temp,s[10];
	temp=s;// 为什么要交换地址,因为是字符串,字符串并不能用以下的方法来交换 
	for(i=1;i<n;++i)
	{
		for(j=0;j<n-i;++j)
		{
			if(strcmp(p[j],p[j+1])>0) // 记得字符串比较函数,1、实参是输入的地址如char *a,*b;2、 strcmp(a,b); 
			{
					strcpy(temp,p[j]);
					strcpy(p[j],p[j+1]);
					strcpy(p[j+1],temp);// 记得交换字符串 
			}
		}
	}
}



*/

对NO.2 的方法进行图示讲解:



/*
NO3. 
字符串交换的方法如下: 采用的是交换地址的方法		
		for(i=0;i<n;++i)
	{
		for(j=0;j<n-i;++j)
		{
			if(strcmp(*(p+i),*(p+j))>0) // 记得字符串比较函数,1、实参是输入的地址如char *a,*b;2、 strcmp(a,b); 
			{
					temp=*(p+i);
					*(p+i)=*(p+j);
					*(p+j)=temp;// 记得交换字符串 
			}
		}
*/ 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值