采用无返回值函数调用实现对数组的内容重排
用数组作为函数形参,以及指针作为函数形参来理解,无返回值的函数如何进行值的变换
在排序之前,首先我们应理解数组的作为函数实参与形参的传递规则以及其相关特性,
在我们用数组元素作为实参时,向形参变量传递的是数组元素的值;
用数组名作函数实参时,传递的是数组首元素的地址;
此时用数组名作函数实参时,把实参数组的首地址传递给形参数组,俩个数组共占一段存储单元,即如果形参数组中各元素的值发生变化,会使实参数组的元素的值同时发生变化;
这时候,我们便可以使用其原理来进行编写函数了
在一维数组一维作为形参时,数组大小可以省略;如str[]。
但是在二维数组定义形参时,数组的第二维及以上高维不能省略;如str[][10]。
在C程序中,数组名只代表数组元素的首地址,不代表整个数组。数组名代表一个指针常量,所以不可以改变数组名的指向
接下来,看代码:数组名作形参法
#include<stdio.h>
#include<stdlib.h>
int main()
{
void sort(int array[],int n);
int a[10],i;
printf("请输入数组:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
sort(a,10);
printf("数组排序之后为:\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
system("pause");
return 0;
}
void sort(int array[],int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++) //④:进行完10次比较和值交换之后。这个for循环结束
{
k=i;
for(j=i+1;j<n;j++) //①:注意这个内层for循环的作用
if(array[j]<array[k]) //②:它先指定了一个array[k]进行比较,同时在所有比较完之后,将最小的那个元素的索引值赋值给k
k=j;
t=array[k]; //③:比较完一轮的for之后,它才开始进行值的交换,将最小的值赋值给array[i]
array[k]=array[i];
array[i]=t;
}
}
运行结果为:
从运行结果我们可以看到,数组元素通过在无返回值的函数sort()中实现了值的交换,
因为在内存地址中,函数实参数组与形参数组共占一段存储单元,在被调函数中数组元素的改变,内存地址上存放的值随之改变,所以达到了对数组元素的重新排序。
如果对选择法不太理解,可以通过代码中的①②③④逐步进行理解。
(降序)选择法的原理是先将数组中最小数与数组中的第一个元素值进行调换,每一轮交换一个元素值,但交换元素值首先会进行寻找最小值的索引,索引就是元素的下标,找出下标后再进行引用交换。
了解了数组法之后,接下来看使用指针作为函数形参对数组进行排序,看代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
void sort(int *p,int n);
int a[10],i;
printf("请输入数组:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
sort(a,10);
printf("数组排序之后为:\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
system("pause");
return 0;
}
void sort(int *p,int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++) //④进行完10次比较和值交换之后。这个for循环结束
{
k=i;
for(j=i+1;j<n;j++) //①注意这个内层for循环的作用
if(*(p+j)<*(p+k)) //②它先指定了一个*(p+j)也就是形参数组法中的array[k]拿出来进行比较,同时在所有比较完之后,将最小的那个元素的索引值赋值给k
k=j;
t=*(p+k); //③比较完一轮的for之后,它才开始进行值的交换,将最小的值赋值给*(p+i)也就是形参数组法中的array[i]
*(p+k)=*(p+i);
*(p+i)=t;
}
}
运行结果为:
从运行结果我们可以看出,采用指针作为形参也实现了对数组中的元素进行排序。依旧按照上述理解,但是同样先浅略的了解一下它的语法规则:
定义指针变量:类型名 * 指针变量名;指向整型数据类型的指针类型表示”int *”
当函数调用时出现指针作为形参时,将变量的地址传给形参p,此时指针p所指向的是实参的地址。当形参变量指向的元素的值发生变化时,对应的实参地址上的值发生改变。即函数执行期间,可以再被赋值。
但当调用函数中,使用地址交换来达到变量值的交换是行不通的,因为在地址交换只是指针变量的指向发生了变化,当函数调用是单向的传递方式,这种地址指向的改变不会带回主调函数,主调函数仍然是原来的指向。
比如:如果在上述指针法被调函数中代码改为:
#include<stdio.h>
#include<stdlib.h>
int main()
{
void sort(int *p,int n);
int a[10],i;
printf("请输入数组:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
sort(a,10);
printf("数组排序之后为:\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
system("pause");
return 0;
}
void sort(int *p,int n)
{
int i,j,k;
int *t,*p1,*p2;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(*(p+j)<*(p+k))
k=j;
p1=(p+k);
p2=(p+i);
t=p1;
p1=p2;
p2=t;
}
}
是行不通的,大家可以尝试一下,运行结果为:
如果觉得内容稍可,请留下你们的
若有不理解可在评论区下方留言。
上次函数内容一的内容在:
http://t.csdn.cn/BUF43
可结合浏览。