#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;// 记得交换字符串
}
}
*/