内容正文:
课程单元教案
本课编号
21
本课课时
4学时
内容提要
项目7 指针应用
任务3数组与指针应用
教学目的
1.掌握指向数组元素的指针变量的定义和引用方法;
2.掌握指向数组的指针变量作为函数参数的应用。
知识能力
结构
1.掌握指向数组元素的指针变量的定义和引用方法;
2.掌握指向数组的指针变量作为函数参数的应用。
教学重点
难点
重点:掌握指向数组元素的指针变量的定义和引用方法; 掌握指向数组的指针变量作为函数参数的应用。
难点: 掌握指向数组的指针变量作为函数参数的应用。
教学手段
方法
教学方法:任务驱动教学法、启发式
教学手段:课堂讲授法、多媒体教学
思考题与
习题
1.指针如何与数组建立指向关系?
2.如何用指针访问一维数组?
3.如何用指针访问二维数组?
教学内容进程设计
复习回顾:指针变量定义、功能和用法。
任务导入:综合实践7 学生成绩管理系统指针应用设计
任务描述:学生成绩管理系统文指针应用设计:应用指针实现学生成绩信息(包括学号、姓名、5门成绩、总分、平均分等基本信息)的输入、输出及处理。并用指针作为函数形参实现综合实践6中的各项功能。
任务3 数组与指针应用
3.1指针与一维数组
1.数组元素的指针
定义格式:类型名 *指针变量名;
用指针变量指向数组元素:
int a[10]={1,2,3,4,5,6,7,8,9,10},*p;
p=&a[0]; //等价于p=a;
说明:数组名代表数组元素的首地址,不代表整个数组,所以p=a和p=&a[0]是等价的。
举例1、通过指针输入并输出整型数组的10个元素值。
#include<stdio.h>
main(){
int a[10],*p,i;
printf(“输入10个整数:
”);
p=a;
for(i=0;i<10;i++){
scanf(“%d”,p++); }
p=a;
for(i=0;i<10;i++){
printf(“%3d”,*p++); }
printf(“
”); }
执行scanf(“%d”,p++);输入数据后指针移动,当循环结束后指针指向尾元素的下一个存储空间。因此,执行printf(“%3d”,*p++);之前,需要把指针进行复位:p=a;。
2.访问数组元素的方法
访问数组元素除了常用的下标法之外,还可以用数组名和指针变量进行访问,称为地址法和指针法。
例如:int a[10]={1,2,3,4,5,6,7,8,9,10},*p;
用地址法访问数组元素:
for(i=0;i<10;i++)
printf(“%3d”,*(a+i));
说明:(1)数组名代表数组首地址,是一个指针型常量程序运行期间是固定不变的,所以不允许更新操作,如a++;或者a=a+1;都是错误的。
(2)a+i代表元素a[i]的地址。
(3)一维数组a中的元素a[i]用地址法可表示为:*(a+i) 。
指针法访问数组元素,指针可以移动,也可以保持指向不变。
指针移动:printf(“%3d”,*p++);
指针不动:printf(“%3d”,*(p+i));
说明:(1)p+i和a+i就是a[i]的地址,或者说它们指向数组的第i个元素。
(2)*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。
(3)指向数组元素的指针变量可以带下标,如p[i]与*(p+i)等价。
(4)指针变量可以实现本身的值改变,数组名不可以,即:p++正确,而a++不正确。
举例:用指针法求一维数组中的最大值。
#include <stdio.h>
#define N 10
main(){
int a[N],i,max;
printf("请输入%d个数据:",N);
for(i=0;i<N;i++)
scanf("%d",&a[i]);
max=a[0];
for(i=0;i<N;i++)
if(max<a[i])
max=a[i];
printf("最大值为%d
",max);}
for(p=a;p<a+N;p++)中用指针变量作为循环控制变量,首地址为a,尾地址为a+N。
3.4指针与二维数组
1.二维数组
假设有定义:
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
说明:a是二维数组名,有三个行元素:a[0]、a[1]和a[2],它们分别代表一个包含有4个元素的一维数组。因此把二维数组可以想象成“数组的数组”。
说明:a、a+1和a+2是行地址,a[0]、a[1]和a[2]是列地址,根据地址访问法a[0]等价于*a, a[1]等价于*(a+1), a[2]等价于*(a+2),则元素a[i][j]的地址访问法为*(*(a+i)+j)。
举例:用地址法实现3*4二维数组元素的输入和输出。
#include <stdio.h>
main(){
int a[3][4],i,j;
printf("地址法输入3*4的二维数组元素:
");
for(i=0;i<3;i++){
for(j=0;j<4;j++){
scanf("%d",*(a+i)+j); }}
printf("地址法输出二维数组:
");
for(i=0;i<3;i++){
for(j=0;j<4;j++){
printf("%d ",*(*(a+i)+j)); }
printf("
"); }}
*(a+i)+j表示a[i][j]元素的地址,则*(*(a+i)+j)表示a[i][j]元素。
2.指针与二维数组
(1)指向二维数组元素的指针变量
定义格式:类型标识符 *指针变量名;
举例:用指向数组元素的指针变量p访问整型二维数组a[3][4]的元素。
#include<stdio.h>
main(){
int a[3][4],i,j,*p;
printf("输入3*4的二维数组元素:
");
p=&a[0][0];
for(i=0;i<3;i++){
for(j=0;j<4;j++){
scanf("%d",p++); } }
printf("输出二维数组:
");
p=&a[0][0];
for(i=0;i<3;i++){
for(j=0;j<4;j++){
printf("%d ",*p++); }
printf("
"); }}
指针变量p为指向二维数组元素的指针变量,初始值为a[0][0]的地址,则p++表示指向下一个元素。
(2)指向一维数组的指针变量
定义格式:类型标识符 (*指针变量名)[整型常量];
功能:定义一个包含有若干个元素的一维数组的指针变量。
举例:用指向一维数组的指针变量p访问整型二维数组a[3][4]的元素。
#include<stdio.h>
main(){
int a[3][4],i,j,(*p)[4];
printf("输入3*4的二维数组元素:
");
p=a;
for(i=0;i<3;i++){
for(j=0;j<4;j++){
scanf("%d",*(p+i)+j); } }
printf("输出二维数组:
");
for(i=0;i<3;i++){
for(j=0;j<4;j++){
printf("%d ",*(*(p+i)+j)); }
printf("
"); }}
指针变量p为指向包含4个元素一维数组的指针变量,初始值为a,则p++不是指向下一个元素,而是指向下一行。因此,*(*(p+i)+j)表示a[i][j]元素。
3.3指向数组的指针变量作为函数参数
1.指向一维数组元素的指针变量作为函数参数
在数组名作为函数参数传递中,形参数组只是用来接收实参数组传递的地址符号,而不是一个真实的数组,不必设定长度,也不会开辟新的空间,因此本质上形参数组名就是一个指针变量,接收实参数组传递的地址符号。
举例:用指针变量作为函数参数编写功能函数将数组a中的整数按相反顺序存放。
#include <stdio.h>
void inv(int *x,int n )
{int *p,t,*i,*j;
j=x+n-1;
for (i=x;i<j;i++,j--)
{t=*i;*i=*j;*j=t;} }
main ( )
{int i ,a[10]={3,7,9,11,0,6,7,5,4,2};
printf(“原数组:
");
for (i=0;i<10;i++)
printf("%4d",a[i]);
printf("
");
inv(a,10);
printf(“交换后:
");
for (i=0;i<10;i++)
printf("%4d",a[i]);
printf("
"); }
2.指向二维数组元素的指针变量作为函数参数
举例:假设已有3个学生,每个学生有4门成绩,编写函数求所有学生成绩的总平均分。
#include<stdio.h>
float aver(float *p,int m,int n){
int i,j;
float s=0;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
s+=*p;
p++; } }
return(s/(m*n)); }
main(){
float score[3][4]={{45,67,75,71},{87,80,96,91},{77,75,82,73}};
int i,j;
printf("输出成绩:
");
for(i=0;i<3;i++){
for(j=0;j<4;j++){
printf("%7.2f",score[i][j]); }
printf("
"); }
printf("学生总平均分:%.2f
",aver(score[0],3,4)); }
形参p是指针变量,用于接收二维数组元素score[0][0]的地址,即score[0]的值。
3. 指向一维数组的指针变量作为函数参数
举例:有3个学生,每个学生4门成绩,输入要查询的学生的序号n,编写函数输出该学生的成绩。
#include<stdio.h>
void search(float (*p)[4],int n){
int i;
printf("第%d个同学的成绩:
“,n);
for(i=0;i<4;i++){
printf("%7.2f",*(*(p+n-1)+i)); }
printf("
"); }
main(){
float score[3][4]={{45,67,75,71},{87,80,96,91},{77,75,82,73}};
int i,j,n;
printf("输出成绩:
");
for(i=0;i<3;i++){
for(j=0;j<4;j++){
printf("%7.2f",score[i][j]); }
printf("
"); }
printf("输入学生序号(1-3):");
scanf("%d",&n);
search(score,n); }
其中,形参变量p是指向包含4个元素一维维数组的指针变量,接收实参变量二维数组名score的值,则*(p+n-1)表示要查询的学生所在行的首地址。
随堂实训:
1.用指针变量对一维数组中的元素进行排序并输出。
2.用指针变量作为函数参数实现题目1。
3.用指针变量把3*3的二维数组进行转置并输出。
4.用指针变量作为函数参数实现题目3。
教学小结
1.指向数组元素的指针变量的定义和引用方法;
2.指向数组的指针变量作为函数参数的应用。
学科网(北京)股份有限公司
$$