夜深了,有点烦,就分享一下关于选择排序和数组作为函数参数的一个例题吧。希望对有需要的伙伴有一点点帮助吧。
**题目:用选择法对10个整数进行由大到小的排序。**
#include<stdio.h>
void sort(int *x,int n)
{ int *x_end,*m,u,*p;
x_end=x+n;
int i;
for(;x<x_end-1;x++)
{ p=x;
for(m=x+1;m<x_end;m++)
{
if(*m>*p)
p=m;
}
if(p!=x)
{
u=*x;
*x=*p;
*p=u;
}
}
} int main(void)
{
int a[10],n,*p;
printf("请输入十位数据\n");
int i;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
n=10;
sort(a,10);
p=a;
for(p;p<a+10;p++)
{
printf("%d ",*p);
}
return 0;
}
#include<stdio.h>
void sort(int *x,int n)
//这是数组作为函数参数所设的指针变量,这里也可以直接设数组如:(int x[ ] ,int n).有关数组转换对于形参和实参的要求我会在下面作为补充。//
{ int *x_end,*m,u,*p;
//这是先申明几个指针变量作为备用//
x_end=x+n;
//这是对指针进行一个上线的设置,至于为啥会单独用一个指针变量来表示,这是为了保证原来的传的数组会被改变,因为下面x是作为变量来变的。//
int i;
for(;x<x_end-1;x++)
//至于为啥这里会减一,这是因为a+10=a[10],避免下面数组越界。为什么这么说呢?是因为m=x+1,一旦x可以取到9则m可以取到10,则数组越界,而且作为选择法其实也只需要n-1次大的循环就好了。//
{ p=x;
for(m=x+1;m<x_end;m++)
{
if(*m>*p)//这里是间接访问来比较值的大小,如果未有看过指针的运算可以先去看看,要不然可能这里会有些糊涂。//
p=m;//这里直接进行地址赋值。//
}
if(p!=x)
{
u=*x;
*x=*p;
*p=u;//有的同学会问了,为啥这里不能直接换地址呢,因为数组作为函数参数,在进行址传递是形参和实参共用一段内存空间的因此修改形参数组元素的值实际上改变的是实参数组的值,而地址是共用的,不能改变,但是指针指向变量的值是可以改变的。也就是说地址不变,但站在地址上面的值我是可以改变的,我通过地址传递改变上面的值。类似于我们文档的在线编辑,我把账号公用你,无论在哪里账号不会改变但是账号里的信息我是可以改变的。//
}
}
} int main(void)
{
int a[10],n,*p;
printf(“请输入十位数据\n”);
int i;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);//简单的输入//
}
n=10;
sort(a,10);
p=a;/为啥还要单独用个指针变量,这是因为a是不变量,我要借用p这个变量。那有人会问那为啥上面x是变量a,那是因为x是形参,起到一个传递地址的作用,是一个指针变量,而我们这里是数组名是常量,不可以变的。/
for(p;p<a+10;p++)
{
printf("%d ",*p);
}
return 0;
}
有关数组转换对于形参和实参的要求如下。如果主调函数有一个数组,想在被调函数改变此数组的值,被调函数的实参与形参定义如以下集中情形:
- 形参定义为数组,实参用数组名;
- 形参定义为指针变量,实参用数组名;
- 实参与形参都用指针变量;
- 形参定义为数组,实参用指针变量;
- (数组形式int *x[ ] 指针形式 int *x)
早点休息吧everyone。祝大家期末不挂科。绩点满绩哟。