知识要点:指针与数组
视频:
目录
一、任务分析
有一个数组,包含10个元素,将数组中的元素按照逆序存放。
这个任务很简单,主要是为了应用指向一维数组的指针变量作函数参数。
算法分析:
1.定义一个一维数组存储数据;
2.自定义inverse()函数用来实现数组中的元素逆序存放;
3.在main()函数中通过调用自定义inverse()函数来完成任务。
二、必备知识与理论
一个变量有一个地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以用于存放变量的地址,可以指向变量,当然也可以存放数组的首地址和数组元素的地址,也就是说,指针变量可以指向数组或数组元素。
数组的指针是指数组在内存中的起始地址,数组元素的指针是数组元素在内存中的起始地址。
1.指向一维数组的指针变量
可以定义一个与数组类型相同的指针变量来指向数组和数组元素。
例如:int a[6]={2,4,6,8,10,12}; /*定义a为包含6个整型数据的数组*/
int *p; /*定义p为指向整型变量的指针变量*/
则p=&a[0];表示把a[0]元素的地址赋给指针变量p。也就是说p指向a数组中的a[0]元素。
C语言规定,数组名是常量,代表的是数组的首地址。
2.通过指针引用数组元素
若有定义:int a[6]={2,4,6,8,10,12};
int *p=&a[0];
则:①p+i和a+i就是a[i]的地址,或者说,它们指向a数组的第i个元素。
②*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。
③指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价。
根据以上叙述,引用数组中下标是i的元素,可以用:
1)下标法:
数组名下标法:a[i]
指针变量下标法:p[i]
2)指针法:
数组名指针法:*(a+i)
指针变量指针法:*(p+i)
3.指向一维数组的指针变量作函数参数
通过一个例题了解指针变量作为函数的参数,来访问实参数组中数据的具体过程。
【例6.5】用选择法对任意输入的10个整数进行由大到小排序(用指向一维数组的指针变量作函数参数)。
选择法排序的基本思想在前面介绍一维数组的相关知识时已经讲过。在这里主要是应用指向数组的指针变量作函数的形参和实参来对数组元素进行操作。
算法分析:
(1)定义数组a的长度为10,包含a[0]到a[9]共10个元素。
(2)定义一个和数组a相同类型的指针变量p,用它指向数组首地址,通过指针变量对数组中的元素进行操作。
(3)自定义一个sort()函数,在函数中用选择法对这10个整数进行排序。其中sort()函数的形参可以是数组名,也可以是指针变量。
三、任务实施
有一个数组,包含10个元素,将数组中的元素按照逆序存放。
这个任务很简单,主要是为了应用指向一维数组的指针变量作函数参数。
算法分析:对于含有n个元素的数组来说,将a[0]与a[n-1]对换,再将a[1]与a[n-2]对换,……,直到将a[(n-1)/2]与a[n-int((n-1)/2)]两个位于中间的变量对换。用循环处理此问题,既然可以明确地知道交换数据的下标,可设两个“位置指示变量”i和j,i的初值为0,j的初值为n-1,将a[i]与a[j]交换,然后使i的值加1,j的值减1,再将a[i]与a[j]对换,直到i大于或等于j为止。
(1)定义一个一维数组存储数据;
(2)自定义inverse()函数用来实现数组中的元素逆序存放;
(3)在main()函数中通过调用自定义inverse()函数来完成任务。
#include <stdio.h>
void inverse(int x[],int n) /*形参x是数组名,相当于int *x */
{ int temp,i,j;
for(i=0,j=n-1;i<j;i++,j--) /*i,j为数组x中前面元素和后面元素的下标*/
{temp=x[i];x[i]=x[j];x[j]=temp;}
}
main()
{ int i,a[10]={3,7,9,11,0,6,7,5,4,2};
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
inverse(a,10); /*实参a为数组名*/
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
}
当然,对于函数inverse(),若以指针变量作为函数的参数,设两个“地址指示变量”p和q,p的初值为传递的数组首地址,q的初值为数组中最后一个元素的地址。将*p与*q交换,然后使p的地址后移一个元素的位置,q的地址前移一个元素的位置,再将*p与*q对换,直到p大于或等于q为止。基于这个思想,函数的代码也可以写成下面的形式。
void inverse(int *pa,int n) /*形参pa是指针变量 */
{ int temp,*p,*q;
for(p=pa,q=pa+n-1;p<q;p++,q--) /*利用指针变量p和q保存数组元素的地址*/
{temp=*p;*p=*q;*q=temp;}
}
这个函数也可以实现数组元素的逆序存储,同时也比较简单明了。