最近发现自己对指针忘得差不多了,写两个题复习一下
问题1:用指向指针的指针的方法对5个字符串排序
代码实现如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 10
/*数组大小用宏定义表示,目的是方便数组大小的修改*/
void sort(char **pt,int n);
int main()
{
char ch[5][MAX];//ch[i]是一维字符指针,ch是二维指针。
char **pt,*ptr[5];//ptr本身是一个二维指针,因为以ptr为名的数组里面全部存放的是指针
int i;
for(i=0;i<5;i++)
scanf("%s",ch[i]); //要想从键盘输入多个字符串,目前只能用二维数组的方法。
for(i=0;i<5;i++)
{
ptr[i]=ch[i];
}
/*若是上面这个循环先被执行
也可以用:scanf("%s",ptr[i]);这条语句来输入。
若是没有上面这个循环就不可以了,因为prt[i]在内存中
并不指向那一个单元。算是野指针,所以没法输入*/
pt=ptr;
sort(pt,5);
printf("\n\n\n");
for(i=0;i<5;i++)
{
printf("%s\n",ptr[i]);
}
}
void sort(char **pt,int n) //采用选择法排序。
{
int i=0,k=0,j=0;
char *temp;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(strcmp(*(pt+k),*(pt+j))>0)
{
k=j;
}
}
temp=*(pt+i);
*(pt+i)=*(pt+k);
*(pt+k)=temp;
}
}
问题2:用指向指针的指针的方法对n个整数进行排序
实现的代码如下:
#include<stdio.h>
int main()
{
void sort(int **p,int n);
int i,n,data[100],**p,*pstr[100];//这里定义了一个指针数组。
scanf("%d",&n);
for(i=0;i<n;i++)
{
pstr[i]=&data[i]; //数组data每一个元素都有其本身对应的地址。
}
for(i=0;i<n;i++)
{
scanf("%d",pstr[i]);
}
p=pstr; //这里要注意pstr是二维指针常量,以它为数组名的数组之中含有的全部都是指针。
sort(p,n);
printf("now,the sequence is:\n");
for(i=0;i<n;i++)
printf("%d ",*pstr[i]);
printf("\n");
return 0;
}
void sort(int **p,int n)
{
int i,j,*temp,k;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(**(p+k)>**(p+j))
k=j;
}
temp=*(p+k); //也可以把这里直接放到if语句后面,也是一样的效果。。。
*(p+k)=*(p+i);
*(p+i)=temp;
/*指针的指向改变了,然而并不改变值得存储情况。
也即pstr数组当中的各元素内容改变了,然而整形数
组并没有任何改变*/
}
}