C语言实验内容.docx
《C语言实验内容.docx》由会员分享,可在线阅读,更多相关《C语言实验内容.docx(17页珍藏版)》请在冰点文库上搜索。
C语言实验内容
第八章指针
8.1目的和要求
1、掌握指针的概念和定义方法。
2、掌握指针的操作符和指针的运算。
3、了解指针与数组的关系。
4、了解指针与字符串的关系。
5、学习指针在函数中的应用。
8.2相关知识
1、指针变量的定义和初始化
指针变量是用来存放其它变量地址的变量。
其定义格式如下:
存储类型数据类型*指针变量名1[=初值1],…
说明:
①相同类型的指针变量和普通变量可以放在一起说明。
②指针变量和普通变量完全一样,由它的定义位置决定指针的作用域和生命期。
③要使一个指针变量指向一个确定的变量,必须将该变量的地址赋给指针变量。
④一个指针只能指向同一个类型的变量。
2、&运算符和*运算符
在C语言中提供了两个有关指针的运算符:
①&运算符称为“取地址运算符”。
②运算符称为“指针运算符”,也称为“间接运算符”,如:
*p代表p所指向的变量。
3、使用指针运算符应注意的问题
1指针变量定义中的“*”与“*”运算符的区别。
指针变量定义中的“*”不是运算符,它只是表示其后的变量是一个指针类型的变量。
而对于语句“*p=5;”,其中的“*”是指针运算符“*”,“*p”代表p指向的变量。
②&运算符与*运算符是互逆的。
如:
y=x;y=*&x;两个语句是等效的。
4、对指针变量的操作
在定义了一个指针变量之后,如:
int*p,a;就可以对该指针进行各种操作。
①给一个指针变量赋予一个地址值,如:
p=&a;。
②输出一个指针变量的值,printf(“%o”,p);。
③访问指针变量所指向的变量,如:
printf(“%d”,*p);。
5、指向数组的指针变量的使用
数组名本身可以看成是该数组的指针,但它的位置是固定的。
如果定义一个指针变量,并把这个指针指向该数组的起始地址,那么通过对指针的运算,就可以完成对数组的访问。
如,引用一维数组元素(inta[10],*p=a;)的方法有:
①下标法,如:
a[i],p[i]。
2地址法,如:
*(a+i),*(p+i)。
6、指针数组和多级指针
①一个数组,如果每个元素都是指针类型的,则它是指针数组。
指针数组是用来存放一批地址的。
②当定义的某个指针变量专门用来存放其它指针变量的地址时,这样的指针变量就称为指针的指针,也称二级指针。
7、指针型函数及函数指针
1指针型函数,是指函数的返回值是指针型的,即这类函数的返回值是地址数据。
指针型函数调用与一般函数的调用方法完全相同,唯一需要注意的是只能用指针变量或指针型数组元素来接受指针型函数的返回值。
②指向函数的指针称为函数指针,当把函数名赋给指针变量时,该指针变量的内容就是函数的存储地址。
函数指针的作用主要是把指针作为参数传送到其它函数。
如果使指针变量指向不同的函数,将它的值传给被调用函数中的形参时,能调用不同的函数。
8.3实验练习
实验练习1:
输入3个整数,按从大到小的次序输出(使用指针)。
本练习要求在封闭式实验课中在助教或者讲师的指导下完成。
本练习分成6个部分:
1.实验目的
2.问题描述
3.事例输出
4.程序模板
5.问题解答提示
6.后续问题和任务
程序模板是完整的、可实际运行的C程序,其中关键的一行或者多行代码已经替换为注释。
请先阅读问题描述,分析事例输出;然后研究模板的代码。
参考问题解答提示,用C代码替换/**/注释。
编译并执行程序,并将输出结果与提供的事例输出进行比较。
然后回答强化练习。
实验目的
本实验旨在巩固学生对指针这种数据结构的理解,增强程序设计能力。
在这个实验中,学生将练习:
•定义一个指针变量并使它指向一个一维数组,它有三个数组元素。
•在循环语句中使指针下移,依次输入三个整数存入数组中。
•使指针上移,指向第三个数组元素。
•第三个数与第一个数进行比较,若小于第一个数则交换。
•第三个数与第二个数进行比较,若小于第二个数则交换。
••第二个数与第一个数进行比较,若小于第一个数则交换。
•利用循环语句,按反序输出数组,即输出第一个数、第二个数、第三个数。
在强化练习中,学生将练习:
•按从小到大的次序输出三个整数。
•在循环语句中,不使用循环控制变量i,就用指针p进行输入输出。
•不用数组,使用三个指针变量完成该题。
问题描述
编写程序,从键盘输入三个整数存入数组中,使指针p指向该数组,操作指针使数组中的数按从大到小的次序输出。
示例输出
请输入三个整数:
129055
90
55
12
程序模板
#include"stdio.h"
voidmain()
{inta[3],*p=a;
inti,temp;
printf("请输入三个整数:
");
for(i=0;i<3;i++,p++)
/*利用指针变量输入撒播个整数*/
/*指针变量自减1*/;
if(*p<*(p-2))
/**p与*(p-2)交换*/
/*如果*p小于*(p-1)*/
{temp=*p;*p=*(p-1);*(p-1)=temp;}
/*第2个数与第1个数比较,若第2个数小于第1个数,则交换*/
for(i=2;i>=0;i--,p--)
printf("%d\n",*p);
}
问题解答提示
1.指针是一种特殊的变量,它的值是地址值,说明它时前面冠以*号。
2.将指针指向数组的起始地址,只要把数组名赋给指针变量。
3.利用循环每输入一个数据,指针就下移一个数据。
4.输入完数据后,指针指向最后一个数组元素之后。
应使指针上移指向最后一个数据。
P—实现指针上移。
5.利用条件判断语句if和中间变量temp,将最大的数存放在数组的第一个数组元素中,最小的数存放在第三个数组元素中。
6.在循环语句for中,若初值大于终值,则步长要为负数,循环控制变量的值依次递减直到小于终值才退出循环。
7.如果在实验中碰到任何问题,请向实验老师寻求帮助。
强化练习
1.根据程序模板,按从小到大的次序输出三个整数。
2.修改程序,在循环语句中,不使用循环控制变量i,就用指针p进行输入输出。
3.不用数组,使用三个指针变量完成同样的任务,请修改程序。
,
实验练习2:
编写函数,交换两变量的值。
本练习要求在封闭式实验课中在助教或者讲师的指导下完成。
本练习分成6个部分:
1.实验目的
2.问题描述
3.事例输出
4.程序模板
5.问题解答提示
6.后续问题和任务
程序模板是完整的、可实际运行的C程序,其中关键的一行或者多行代码已经替换为注释。
请先阅读问题描述,分析事例输出;然后研究模板的代码。
参考问题解答提示,用C代码替换/**/注释。
编译并执行程序,并将输出结果与提供的事例输出进行比较。
然后回答强化练习。
实验目的
本实验旨在巩固学生对指针这种数据结构的理解,增强程序设计能力。
在这个实验中,学生将练习:
•说明交换函数swap(),它是无值类型的,它有两个参数且都是指针型的。
•用scanf()输入两个整数。
•printf()输出交换前的两个数。
•调用交换swap()函数,实参是取两变量的地址,将它们传给形参,即形参指针指向实参变量
•使用临时变量,交换两形参变量的值。
•返回主函数后,调用printf()输出交换的两个数。
在强化练习中,学生将练习:
•使用两个全局变量重编该程序。
•实参和形参都用变量名,重编该程序。
问题描述
编写程序,在主函数中输入两个整数存入变量,调用交换函数交换两变量的值。
示例输出
请输入两个整数:
2589
交换前 a=25b=89
交换后 a=89b=25
程序模板
#include"stdio.h"
voidmain()
{inta,b;
/*交换函数的说明*/
/*提示输入两个变量*/
/*使用scanf()函数输入两个整数*/
printf("交换前 a=%db=%d\n",a,b);
/*调用交换函数*/
/*输出交换后两变量的值*/
}
/*交换函数的头部*/
{inttemp;
/**p与*q交换*/
}
问题解答提示
1.交换函数的调用在前,而实现在后。
所以要预先说明,说明时只要指出函数的类型及参数的个数、类型即可。
2.可以使用临时变量交换两变量的值。
也可以不用临时变量来交换两变量的值。
若变量a与b交换,算法为:
a=a+b;b=a-b;a=a-b;
3.我们研究的都是单值函数,任何函数无法返回两个值,所以交换函数swap()的类型是无值(void)类型。
通过参数传递传回被交换了的两个变量的值。
4.由于交换函数是无值函数,所以调用时直接写成调用语句。
5.如果在实验中碰到任何问题,请向实验老师寻求帮助。
强化练习
1.根据程序模板,使用两个全局变量重编该程序。
2.在程序中,若实参和形参都用变量名,会出现什么情况?
实验练习3:
编写函数*match,在一个整型数组中查找输入的一个整数,找到后把该数置换为0。
本练习要求在封闭式实验课中在助教或者讲师的指导下完成。
本练习分成6个部分:
1.实验目的
2.问题描述
3.事例输出
4.程序模板
5.问题解答提示
6.后续问题和任务
程序模板是完整的、可实际运行的C程序,其中关键的一行或者多行代码已经替换为注释。
请先阅读问题描述,分析事例输出;然后研究模板的代码。
参考问题解答提示,用C代码替换/**/注释。
编译并执行程序,并将输出结果与提供的事例输出进行比较。
然后回答强化练习。
实验目的
本实验旨在巩固学生对指针这种数据结构的理解,增强程序设计能力。
在这个实验中,学生将练习:
•定义一个一维数组,含有11个数组元素并且赋予10个初值。
•利用循环语句,进行替换前的输出。
•使用scanf()函数,输入待替换的数。
•以实参为数组名、数组的大小及待替换的数调用匹配函数。
•在匹配函数中,查找待替换的数。
•从替换函数返回一个地址,将0送入该地址所指单元。
•利用循环语句,进行替换后的输出。
在强化练习中,学生将练习:
•在该程序中,若将数组定义为”inta[10]”,当在数组中找不到待查找数时会产生什么后果?
•若数组中有两个相同的待查找数据,编程查看是哪个待查找数据被置换。
•将指定位置的数据置换为0。
问题描述
编写程序,在一个整型数组中查找输入的一个整数,找到后把该数置换为0,没找到数组不变。
示例输出
替换前的输出:
12345678910
输入待替换的数:
6
替换后的输出:
12345078910
程序模板
#include"stdio.h"
/*匹配函数的说明*/
voidmain()
{inta[11]={1,2,3,4,5,6,7,8,9,10};
intb,i;
/*提示替换前的输出*/
for(i=0;i<10;i++)
printf("%d",a[i]);
/*输出回车换行*/
printf("输入待替换的数:
");
/*用scanf()输入待替换的数*/
/*调用匹配函数并将数字0存入该函数的返回值中*/
printf("替换后的输出:
");
for(i=0;i<10;i++)
/*输出数组a的数组元素的值,并且每两个值之间空一格*/
printf("\n");
}
int*match(int*p,intn,intb)
{inti;
/*循环语句,循环条件是数组的下标没超过10并且还没找到相匹配的数*/
/*返回待查找数据的单元地址或数组最后一个数组元素的地址*/
}
问题解答提示
1.match()函数是指针型函数,在说明和定义它时要在其函数名前写上“*”。
2.match()函数是指针型函数,它的返回值是地址值,所以在主函数中要用取内容运算符”*”,将数值0放入该单元。
3.因为match()函数的返回值是地址值,所以其调用可以放在赋值运算符的左边
4.在这10个数中如果查找不到待查找数的话,就会返回a[10]的地址,所以主函数中数组a的大小应定义为11。
5.如果在实验中碰到任何问题,请向实验老师寻求帮助。
强化练习
1.根据程序模板,若将数组定义为”inta[10]”,当在数组中找不到待查找数时会产生什么后果。
2.若数组中有两个相同的待查找数据,编写程序查看是哪个待查找数据被置换。
3.修改程序,将指定位置的数据置换为0。
实验练习4:
编写程序,输入10个整数,将其中最小的数与第一个数交换,最大的数与最后一个数交换。
本练习要求在封闭式实验课中在助教或者讲师的指导下完成。
本练习分成6个部分:
1.实验目的
2.问题描述
3.事例输出
4.程序模板
5.问题解答提示
6.后续问题和任务
程序模板是完整的、可实际运行的C程序,其中关键的一行或者多行代码已经替换为注释。
请先阅读问题描述,分析事例输出;然后研究模板的代码。
参考问题解答提示,用C代码替换/**/注释。
编译并执行程序,并将输出结果与提供的事例输出进行比较。
然后回答强化练习。
实验目的
本实验旨在巩固学生对指针这种数据结构的理解,增强程序设计能力。
在这个实验中,学生将练习:
•定义一个输入函数,从键盘输入10个整数并存入数组中。
•定义一个求最大值和最小值的函数max_min()。
•在max_min()函数中,共定义四个指针变量,分别指向最大值、最小值、数组尾部及一个临时指针。
•将指针array_end指向数组的尾部。
•先将指针max、min指向数组的第一个元素,然后利用循环和临时指针使max、min分别指向数组中的最大值和最小值。
•使最小值与第一个数交换,最大值与最后一个数交换。
•定义一个输出函数,输出重排后的数组。
在强化练习中,学生将练习:
•在max_min()中,只定义两个指针变量,不定义指向最大数和最小数的指针。
•将数组定义为全局数组。
•将输入和输出函数部分插入到主函数中。
问题描述
编写程序,从键盘输入10个整数并存入数组,将其中最小的数与第一个数交换,最大的数与最后一个数交换,然后输出重排后的数组
。
示例输出
Input10integer:
78253698126658697932
Output10integer
12253632786658697998
程序模板
#include"stdio.h"
/*输入函数input()的头部*/
{inti;
printf("Input10integer:
\n");
for(i=0;i<10;i++)
/*scanf()函数输入整数*/
}
voidmax_min(intnum[])
{/*定义指针变量max、min*/
int*p,*array_end;
/*使指针array_end指向数组的最后一个数据之后*/
/*使指针max、min指向数组的第一个数据*/
/*for循环的头部。
指针p为循环控制变量,循环条件是:
当p指向数组的最后一个数据之后时结束循环,每次使指针p下移一个数据*/
if(*p>*max)
/*使max与p的指向相同*/
elseif(*p<*min)
min=p;
/*使最小值与第一个数交换*/
*p=num[9];num[9]=*max;*max=*p;
}
voidoutput(intnum[])
{int*p;
/*输出信息的提示*/
for(p=num;pprintf("%d\t",*p);
printf("\n");
}
voidmain()
{intnumber[10];
/*调用输入函数*/
/*调用max_min()*/
/*调用输出函数*/
}
问题解答提示
1.在max_min()中,为保证数组的最后一个数据能得到处理,将指针变量array_end指向数组的最后一个数据之后。
2.p++是指针下移,在C中每次下移两个单元。
因为在C中整数占两个单元。
3.语句max=p;,是把p中存放的地址值赋给max,即p和max指向同一单元。
4.条件*p<*min是指若p所指向单元中的数据小于min所指向单元中的数据,则交换。
不能把它写成p5.num[0]中数据与min所指向的单元中的最小数据交换,即是num[0]与*min交换。
不能写成num[0]与min交换。
6.如果在实验中碰到任何问题,请向实验老师寻求帮助。
强化练习
1.根据程序模板,在max_min()中,只定义两个指针变量,不定义指向最大数和最小数的指针,重编程序,
2.将数组定义为全局数组,试对程序做相应的修改。
3.重新编写程序,将输入和输出函数部分插入到主函数中。
8.4综合练习
1.求矩阵a[2][3]={11,22,33,44,55,66}的转置矩阵t[3][2],并按矩阵的形式输出两矩阵,要求用指针实现。
分析:
本题的关键是以指针实现两矩阵中数据传递交换,根据需要可定义两个指针int(*p)[3]和int(*q)[2]用以分别指向矩阵a和b。
#include"stdio.h"
voidmain()
{inta[2][3]={11,22,33,44,55,66},t[3][2];
int(*p)[3],(*q)[2],i,j;
p=a;
q=t;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
*(*(q+j)+i)=*(*(p+i)+j);
printf("矩阵A:
\n");
for(i=0;i<2;i++)
{for(j=0;j<3;j++)
printf("%d",*(*(p+i)+j));
printf("\n");
}
printf("矩阵B:
\n");
for(i=0;i<3;i++)
{for(j=0;j<2;j++)
printf("%d",*(*(q+i)+j));
printf("\n");
}
}
2.有几个人围成一圈,顺序排号。
从第一个人开始报数,凡报到3的人退出圈子,问最后留下的是几号?
分析:
利用含n个元素的数组,它的下标代表每个人的编号。
数组元素num[i](或*(p+i))中存放着编号为i的人是否在圈内的情况,其值为非0表示该人在圈内,为1表示该人在圈外。
#include"stdio.h"
#definemax15
voidmain()
{inti,k,n,m,num[max],*p;
scanf("%d",&n);
p=num;
for(i=0;i*(p+i)=i+1;
i=0;k=0;m=0;
while(m{if(*(p+i)!
=0)
k++;
if(k==3)
{*(p+i)=0;
k=0;
}
i++;
if(i==n)
i=0;
m++;
}
while(*p==0)
p++;
printf("%d%d\n",n,*p);
}