专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »C语言教程 » 指针数组与数组指针:指针与数组(2) »正文

指针数组与数组指针:指针与数组(2)

来源: 发布时间:星期四, 2008年9月25日 浏览:142次 评论:0
80¿
max=9,index=4
[例6-15]用指向数组的指针变量实现一维数组的由小到大的冒泡排序。编写三个函数用于输入数据、数据排序、数据输出。
在第5章的例题中,我们介绍过选择法排序及算法,此例再介绍冒泡排序算法。为了将一组n个无序的数整理成由小到大的顺序,将其放入一维数组a[0]、a[1]...a[n-1]。冒泡算法如下:
(开序)
①相邻的数组元素依次进行两两比较,即a[0]与a[1]比、a[1]与a[2]比...a[n-2]与a[n-1]比,通过交换保证数组的相邻两个元素前者小,后者大。此次完全的两两比较,能免实现a[n-1]成为数组中最大。
②余下n-1个元素,按照上述原则进行完全两两比较,使a[n-2]成为余下n-1个元素中最大。
③进行共计n-1趟完全的两两比较,使全部数据整理有序。
下面给出一趟排序的处理过程:

4个元素进行3次两两比较,得到一个最大元素。若相邻元素表示为a[j]和a[j1],用指针
变量P指向数组,则相邻元素表示为*(Pj)和*(Pj1)程序实现如下:
#include<stdio.h>
#defineN10
main()
{
voidinput();/*函数声明*/
voidsort();
voidoutput();
inta[N],*p;/*定义一维数组和指针变量*/
input(a,N);/*数据输入函数调用,实参a是数组名*/
p=a;/*指针变量指向数组的首地址*/
sort(p,N);/*排序,实参p是指针变量*/
output(p,N);/*输出,实参p是指针变量*/
}
voidinput(arr,n)/*无需返回值的输入数据函数定义,形参arr是数组*/
intarr[],n;
{
inti;
printf("inputdata:\\n");
for(i=0;i<n;i)/*采用传统的下标法*/
scanf("%d",&arr[i]);
}
voidsort(ptr,n)/*冒泡排序,形参ptr是指针变量*/
int*ptr,n;
{
inti,j,t;
for(i=0;i<n-1;i)
for(j=0;j<n-1-i;j)
if(*(ptrj)>*(ptrj1))/相*临两个元素进行比较*/
{
t=*(ptrj);/*两个元素进行交换*/
*(ptrj)=*(ptrj1);
*(ptrj1)=t;
}
}
voidoutput(arr,n)/*数据输出*/
intarr[],n;
{
inti,*ptr=arr;/*利用指针指向数组的首地址*/
printf("outputdata:\\n");
for(;ptr-arr<n;ptr)/*输出数组的n个元素*/
printf("%4d",*ptr);
printf("\\n");
}




由于C程序的函数调用是采用传值调用,即实际参数与形式参数相结合时,实参将值传给形式参数,所以当我们利用函数来处理数组时,如果需要对数组在子程序中修改,只能传递数组的地址,进行传地址的调用,在内存相同的地址区间进行数据的修改。在实际的应用中,
如果需要利用子程序对数组进行处理,函数的调用利用指向数组(一维或多维)的指针作参数,无论是实参还是形参共有下面四种情况:

我们知道,二维数组在内存中是按行存放,假定我们定义二维数组和指针如下:
inta[3][4],*p=a[0];
则指针p就指向二维数组。其在内存的存放情况如图6-11所示。

从上述存放情况来看,若把二维数组的首地址传递给指针p,则映射过程如图6-11
所示。我们只要找到用p所表示的一维数组中最大的元素及下标,就可转换为在二维数组中的
行列数。
#include<stdio.h>
main()
{
inta[3][4],*ptr,i,j,max,maxi,maxj;
/*max是数组的最大,maxi是最大元素所在行,maxj是最大元素所在列*/
for(i=0;i<3;i)
for(j=0;j<4;j)
scanf("%d",&a[i][j]);

如果本文没有解决您的问题,请进老妖怪开发者社区提问

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: