x=*p1;*'
for(p1=a;p1^printff^d^+pl);.
卜
将填空后完整的程序以文件名为nixu_1.c保存在实验8文件夹里。
(需要存盘)
页眉内容
共享知识分享快乐
程序填空实例8-3:
用指针访问简单变量。
从键盘输入三个整数,要求设三个指针变量p1,p2,p3,使pl指
向三个数的最大者,p2指向次大者,p3指向最小者,然后按由小到大的顺序输出这三个数。
将填空后完
整的程序以文件名为blank8_3.c保存在实验8文件夹里。
(需要存盘)
ttinclude"stdio・h"
voidmjinQ
<
inta,b;
int*p1,*p2,*p3;
printFf-请输入三个整数值(a,b,c);\n")scanf(Ia%dAd;
pl=&a;
/*
/*使指针P3指向简单变量U*/
p2=Etb;
p3=&c;
iF(wp1<*p2)
temp-*p1;*p1=*p2;*p2-temp;
卩rintf,怎dAd\n".*p3.*p2,*p1);
>
程序填空实例8-4:
用指针来处理一维数组元素。
从键盘上输入若干个字符,以符号“@”结束。
编一个
C程序,统计这些符号的个数(不包括@)存入数组元素a[0],将这些符号依次存入a[1]、a[2]、a[3]、…中。
接着利用a[0]中存放的字符个数,输出这些字符。
将填空后完整的程序以文件名为blank8_4.c保存
在实验8文件夹里。
(需要存盘)
【待填充的源程序参考清单】
#include
voidmain()
{chara[100]={0},=a,c;
scanf("%c",&c);
while()
{;
*pa=c;
scanf("%c",&c);
}
printf("\nnumberofstring:
%d\nstring:
\n",a[0]);
for(pa=a+1;pa<=;pa++)
printf("%c",*pa);
printf("\n");
共享知识分享快乐
}
[实验任务二]:
通过调试和补充实例程序,以达到能正确使用指针变量作为函数的参数进行地址传递的目的。
编程实例8-1:
编一个函数intfun(*charss),它的功能是:
把sS字符串中的字符按逆序存放。
例如:
若输入字符串为ABCDEFG,则逆置后的字符串为GFEDCBA。
请勿改动主函数main和其它函数中的任何内容,在函数fun的花括号中填入你编写的若干语句。
#include
#include
#defineM81
intfun(char*ss)
{/*答题开始*/
I
I
I
I
I
I
/*答题开始*/
}
voidmain()
{char*a;
printf("\nPleaseenterastring:
");
gets(a);
fun(a);
printf("\nThenewstringis:
%s\n",a);
}
将编写好的程序以文件名daoxu.c最终保存在实验8文件夹里。
(需要存盘)
编程实例8-2:
下面程序用来实现a,b两个数的交换。
#include
voidmain()
{inta,b,*pa,*pb;
printf(“pleaseinputtwointegernumbers:
\n”);
scanf(“%d%d”,&a,&b);
printf(“thevaluesofaandbbeforeexchangingare:
\n”);
printf(“a=%db=%d\n”,a,b);
pa=&a;pb=&b;
swap(pa,pb);
printf(“thevaluesofaandbafterexchangingare:
\n”);
printf(“a=%db=%d\n”,a,b);
}
swap(int*p1,int*p2)
{int*p;
*p=*p1;*p1=*p2;*p2=*p;
页眉内容
共享知识分享快乐
}
【问题】:
①上述程序能否完成两个数互换的目地,为什么?
如何改正?
②若把swap函数改写成如下形式:
int*p1sint*p2)
<
int*p;
P=P1:
p1^p2;
P2=p;
>
能否达到此目的,为什么?
如何改正。
将改正好的程序以文件名swap.c保存在实验8文件夹里。
(需要存盘)
[实验任务三]:
通过设计一个实际例子掌握数组、指针和函数的综合编程方法。
设计程序实例8-1:
打印最高分和学号
假设每班人数最多不超过40人,具体人数由键盘输入,试编程打印最高分及其学号。
程序1用一维数组和指针变量作为函数参数,编程打印某班一门课成绩的最高分及其学号。
程序2用二维数组和指针变量作为函数参数,编程打印3个班学生(假设每班4个学生)的某门课
成绩的最高分,并指出具有该最高分成绩的学生是第几个班的第几个学生。
程序3用指向二维数组第0行第0列元素的指针作为函数参数,编写一个能计算任意m行n列二维数组中元素的最大值,并指出其所在的行列下标值的函数,利用该函数计算3个班学生(假设每班4个学
生)的某门课成绩的最高分,并指出具有该最高分成绩的学生是第几个班的第几个学生。
程序4编写一个计算任意m行n列二维数组中元素的最大值,并指出其所在的行列下标值的函数,利用该函数和动态内存分配方法,计算任意m个班、每班n个学生的某门课成绩的最高分,并指出具有该
最高分成绩的学生是第几个班的第几个学生。
【思考题】请读者思考:
1编写一个能计算任意m行n列的二维数组中的最大值,并指出其所在的行列下标值的函数,能否使用二维数组或者指向二维数组的行指针作为函数参数进行编程实现呢?
为什么?
2请读者自己分析动态内存分配方法(题目要求中的程序4)和二维数组(题目要求中的程序3)两
种编程方法有什么不同?
使用动态内存分配方法存储学生成绩与用二维数组存储学生成绩相比,其优点是
什么?
【说明】:
初学者通常都会对指针望而生畏,其实只要从原理上掌握了指针的概念,它就会变得如此简单而易用。
首先,指针不过是C语言提供的一种比较特殊的数据类型而已,定义为指针类型的变量与其它类型的变量相比,主要差别在于指针变量的值是一个内存地址。
其次,在C语言中,指针和数组之间有
着密不可分的关系,不带下标的数组名就是一个指针,它代表数组元素的首地址,只要让声明为相同基类型的指针变量指向数组元素的首地址,那么对数组元素的引用,既可以用下标法,也可以用指针法,用指针法存取数组比用数组下标存取数组速度快一些。
反之,任何指针变量也可以取下标,可以像对待数组一样来使用。
虽然多维数组的地址概念稍微麻烦些,但只要知道它的元素在内存中是如何存放的,使用也就不难了,由于C语言中的多维数组都是按列存放的,因此,用指针法引用时,必须知道数组的一行有多长页眉内容
共享知识分享快乐
(即列的维数)。
在某种意义上,二维数组类似于一个由指向行数组的指针构成的一维指针数组。
多于二维的数组可以通过类似方法进行降维处理。
指针的一个重要应用是用指针作函数参数,为函数提供修改调用变元的手段。
当指针作函数参数使用
时,需要将函数外的某个变量的地址传给函数相应的指针变元,这时,函数内的代码可以通过指针变元改变函数外的这个变量的值。
指针的另一个重要应用是同动态内存分配函数联用,使得定义动态数组成为可能。
本题程序1中,用到了一维数组作为函数参数,程序2用到了指向二维数组的行指针作函数参数,程
序3用到了指向二维数组的列指针作函数参数,程序4用到了动态内存分配实现动态数组。
【设计程序实例8-1的参考答案】:
程序1参考答案:
#include
#defineARR_SIZE40
intFindMax(intscore[],longnum[],intn,longpMaxNum);
voidmain()
{
intscore[ARR_SIZE],maxScore,n,i;
longnum[ARR_SIZE],maxNum;
printf("Pleaseentertotalnumber:
");
scanf("%d",&n);/*从键盘输入学生人数n*/
printf("Pleaseenterthenumberandscore:
\n");
for(i=0;i{
scanf("%ld%d",&num[i],&score[i]);
}亠
maxScore=FindMax(score,num,n,&maxNum);/*计算最高分及其学号*/
printf("maxScore=%d,maxNum=%ld\n",maxScore,maxNum);
}
/*函数功能:
计算最高分及最高分学生的学号
函数参数:
整型数组score,存储学生的成绩
长整型数组num,存储学生的学号长整型指针变量pMaxNum,存储求出来的最高分学生的学号函数返回值:
最高分
*/
intFindMax(intscore[],longnum[],intn,long*pMaxNum)
{
inti;
intmaxScore;
maxScore=score[0];
假设score[0]为最高分*/
记录最高分*/
记录最高分学生的学号num[i]*/
返回最高分maxScore*/
}
程
Pleaseentertotalnumber:
5/
Pleaseenterthenumberandscore:
9901184/
9901283/
9901388/
9901487/
9901561/
maxScore=88,maxNum=99013
程序2参考答案:
if(score[i][j]>maxScore){
}
}
}/*
maxScore=score[i][j];/**pRow=i;/*
*pCol=j;/*
/*if结束*/
/*内层for结束*/外层for结束*/
记录当前最大值*/记录行下标*/记录列下标*/
return(maxScore);
}
/*
返回最大值*/
/*
置初值,假设第一个元素值最大*/
程序3参考答案:
{
if(p[i*n+j]>maxScore)
{
maxScore=p[i*n+j];/*
*pRow=i;/*
*pCol=j;/*
}/*if结束*/
}/*内层for结束*/
}/*外层for结束*/return(maxScore);/*
}
程序运行结果如下:
记录当前最大值*/记录行下标*/
记录列下标*/
返回最大值*/
Pleaseenterscore:
81727364/
65867788/
91908592/
max=92,class=3,number=4
程序4参考答案:
#include
#include
intFindMax(int*p,intm,intn,int*pRow,int*pCol);
main()
{
int*pScore,i,j,m,n,maxScore,row,col;printf("Pleaseenterarraysizem,n:
");
scanf("%d,%d",&m,&n);/*
/*申请m*n个sizeof(int)字节的存储空间
pScore=(int*)calloc(m*n,sizeof(int));
if(pScore==NULL)
输入班级数m和学生数n*/
*/
{
printf("Noenoughmemory!
'n");exit(0);
}
printf("Pleaseenterthescore:
'n");for(i=0;i{
for(j=0;j{
scanf("%d",&pScore[i*n+j]);/*
}
输入学生成绩*/
}
maxScore=FindMax(pScore,3,4,&row,
/*输出最高分max及其所在的班级和学号*/
&col);/*调用函数FindMax*/
printf("maxScore=%d,class=%d,number=%d\n",maxScore,row+1,col+1);
free(pScore);/*释放向系统申请的存储空间*/
}
/*函数功能:
计算任意m行n列的二维数组中的最大值,并指出其所在行列下标值函数入口参数:
整型指针变量p,指向一个二维整型数组的第0行第0列
整型变量m,二维整型数组的行数整型变量n,二维整型数组的列数
函数出口参数:
整型指针变量pRow,指向数组最大值所在的行
整型指针变量pCol,指向数组最大值所在的列函数返回值:
数组元素的最大值
*/
intFindMax(int*p,intm,intn,int*pRow,int*pCol)
{
max=p[0];/*
*pRow=0;
*pCol=0;
for(i=0;i{
for(j=0;j{
if(p[i*n+j]>max)
{
max=p[i*n+j];/*
*pRow=i;/*
*pCol=j;/*
}/*if结束*/
}/*内层for结束*/
}/*外层for结束*/return(max);/*
}
程序运行结果如下:
Pleaseenterarraysizem,n:
3,4
Pleaseenterthescore:
81727364/
65867788/
91908592/
maxScore=92,class=3,number=4
置初值,假设第一个元素值最大*/
记录当前最大值*/
记录行下标*/
记录列下标*/
返回最大值*/
/
inti,j,max;
★作业上交(千万不要忘记):
C程序编译、连接、运行成功后,请务必将源程序(扩展名为.C、存于E:
盘以本人姓名为名称的文件夹下,如匡珍春\c01.c)复制到K:
盘对应的文件夹中,如K(01):
\陆上
110105匡珍春实验8,才算上交作业。
注:
为了方便自己使用,不妨将源程序备份到可移动存储器上(如U盘、手机卡等)
*pMaxNum=num[0];/*
for(i=1;iif(score[i]>maxScore){
maxScore=score[i];*pMaxNum=num[i];}
return(maxScore);
#include
#defineCLASS3
#defineSTU4
intFindMax(intscore[CLASS][STU],intm,int*pRow,int*pCol);
voidmain()
{
intscore[CLASS][STU],i,j,maxScore,row,col;
printf("Pleaseenterscore:
\n");
for(i=0;i{
for(j=0;j{
scanf("%d",&score[i][j]);/*输入学生成绩*/
}
}
/*计算最高分及其所在班号和学号*/
maxScore=FindMax(score,CLASS,&row,&col);
printf("maxScore=%d,class=%d,number=%d\n",
maxScore,row+1,col+1);
}
/*函数功能:
计算任意m行STU列的二维数组中的最大值、并指出其所在行列下标值
函数入口参数:
二维整型数组score,存储学生的成绩
整型变量m,二维整型数组的行数,代表班级数
函数出口参数:
整型指针变量pRow,指向数组最大值所在的行
整型指针变量pCol,指向数组最大值所在的列
函数返回值:
数组元素的最大值
*/
intFindMax(intscore[][STU],intm,int*pRow,int*pCol)
{
inti,j,maxScore;
maxScore=score[0][0];/*置初值,假设第一个元素值最大*/
*pRow=0;
*pCol=0;
for(i=0;i{
for(j=0;j{