第十章指针.docx
- 文档编号:4283775
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:15
- 大小:19.51KB
第十章指针.docx
《第十章指针.docx》由会员分享,可在线阅读,更多相关《第十章指针.docx(15页珍藏版)》请在冰点文库上搜索。
第十章指针
第十章指针
通过本章实验作业应达目标
1.掌握使用指针变量的方法。
2.掌握带有指针形参的函数的定义及调用方法。
3.正确使用指针操作数组元素。
4.正确使用指针数组操作字符串。
本章上交作业
程序10_1_1.c,10_2_1.c,10_3_1.c,10_4_1.c上传至211.64.135.121/casp。
实验一指针作函数参数
【实验目的】
1.掌握指针概念及定义方法。
2.学会利用指针来求解实际问题。
【实验内容】
作业1.编写一个函数voidswap(int*x,int*y),其中的x,y都是指向int的指针,功能是实现x,y所指向的两个int变量的值的交换。
并写出函数调用过程。
请以10_1_1.c命名本程序。
主函数如下:
main()
{
voidswap(int*x,int*y);
inta,b;
scanf("%d,%d",&a,&b);
printf("beforeswap:
a=%d,b=%d\n",a,b);
此处请写出函数调用过程;
printf("afterswap:
a=%d,b=%d\n",a,b);
}
【实验提示】
注意指针作为函数参数的写法。
实验二用指针对元素排序
【实验目的】
1.掌握指针概念及定义方法。
2.学会利用指针和数组来求解实际问题。
【实验内容】
作业1.给定主函数,编写三个函数input()、sort()、output(),分别实现数组元素的输入,数组元素的排序(升序)和数组元素的输出。
请以10_2_1.c命名本程序。
#include"stdio.h"
inti;
main()
{
voidinput(int*a,intn);
voidsort(int*a,intn);
voidoutput(int*a,intn);
inta[10];
input(a,10);
sort(a,10);
output(a,10);
}
【实验提示】
1.可以使用数组那一章讲到的任何一种排序算法。
2.本题关键是指向数组的指针变量的应用。
由于将数组的首地址赋给了形参指针变量,所以可以在被调函数对指针变量所指向的地址处值的修改可以实现对主函数中数组元素值的修改。
【思考】
1.如果只想对a数组的前5个数排序,该如何调用sort函数?
2.如果只想对a数组的后5个数排序,该如何调用sort函数?
实验三测试是否子串函数
【实验目的】
1.掌握指针概念及定义方法。
2.学会利用指针和数组来求解实际问题。
【实验内容】
作业1.编写一个函数intdelnum(int*a,intnum,intn),用于在长度是n的数组a中,删除一个指定的元素num。
并把删除后数组的长度作为函数的返回值。
请以10_3_1.c命名本程序。
主函数如下:
#defineN10
main()
{
inta[N],num;
scanf(“%d”,&num);
输入N个数到数组a中;
调用delnum函数在数组a中删除指定的数num;
输出删除了num后的数组a;
}
实验四字符串的交叉连接
【实验目的】
学会利用多个指针和字符数组来解决实际问题。
【实验内容】
作业1.编写一个函数char*link(char*s1,char*s2),实现字符串s1与s2的交叉连接,连接后得到的新字符串放在s1中,函数返回值为字符数组s1的首地址。
请以10_4_1.c命名本程序。
#include
#include
main()
{
chara[100],b[100];
char*link(char*,char*);
gets(a);
gets(b);
此处请写出link函数的调用过程;
puts(a);
}
例如:
输入abc
输入abcde
实验五指针数组对多个字符串排序
【实验目的】
1.掌握指针数组的概念及定义方法。
2.学会利用指针数组来解决实际问题。
【实验内容】
作业1.从键盘上输入10个字符串,排序后输出。
要求在main()中输入与输出,用另一函数voidstrsort(char**p,intn)对它们按字母顺序实行排序,n是指针数组中元素的个数。
请以10_5_1.c命名本程序。
主函数如下:
#include
main()
{
inta[10][100],*pa[10],i;
voidstrsort(char**p,intn);
for(i=0;i<10;i++)
{
pa[i]=a[i];
gets(p[i]);
}
strsort(pa,10);
for(i=0;i<10;i++)
puts(a[i]);
}
【讨论与思考】
1.比较一下使用指针数组和使用二维数组各自的优缺点。
2.本题是采用交换指针的指向,还是采用交换字符串的位置?
哪一种更好?
实验六从母串中删除子串(综合类)
【实验目的】
掌握指针作函数参数的应用。
【实验内容】
作业1.函数delstr的功能是从字符数组a(母串)中删除的所有子串b,并返回数组a的起始地址。
(子串有可能出现多次)。
请以10_6_1.c命名本程序。
如在"abaaabaacbaababab"中删除"ab",输出为"aaaacba"。
主函数如下:
#include
main()
{
voiddelstr(char*a,char*b);
intstrss(char*s1,char*s2);
chara[200],b[20];
puts("请输入一个字符串:
");
gets(a);
puts("请输入被删的子串:
");
gets(b);
delstr(a,b);
puts(a);
}
【实验提示】
本题方法有很多,下面介绍一种逐个字符比较的方法:
1)首先要做的是查找子串在母串中的位置。
若母串中字符a[i]与子串的第一个字符b[0]相等,则从当前位置开始,比较此后的长度为strlen(b)个字符相等,置标记k=1,则表示b是a的子串,从a[i]开始。
if(a[i]==b[0])
{
for(j=0;b[j]!
='\0';j++)
if(a[i+j]!
=b[j])
break;
if(b[j]=='\0')
k=1;
}
2)找到后开始删除子串。
可以使用strcpy函数,也可以自己使用循环来完成。
for(m=0;a[m]!
='\0';m++)
a[i+m]=a[i+x+m];
3)要注意每一次删除之后,要对i的值减一。
对k的值重新赋值为0。
为什么?
习题
一、选择题
1.变量的指针,其含义是指该变量的________.
a)值b)地址
c)名d)一个标志
2.若有说明;int*p,m=5,n;以下正确的程序段的是________.
a)p=&n;b)p=&n;
scanf("%d",&p);scanf("%d",*p);
c)scanf("%d",&n);d)p=&n;
*p=n;*p=m;
3.若有以下定义,则对a数组元素的正确引用是_________.
inta[5],*p=a;
a)*&a[5]b)a+2c)*(p+5)d)*(a+2)
4.若有定义:
inta[2][3],则对a数组的第i行j列元素地址的正确引用为______.
a)*(a[i]+j)b)(a+i)c)*(a+j)d)a[i]+j
5.下面程序段的运行结果是_________.
char*s="abcde";
s+=2;printf("%d",s);
a)cdeb)字符'c'c)字符'c'的地址d)无确定的输出结果
6.以下正确的程序段是_________.
a)charstr[20];b)char*p;
scanf("%s",&str);scanf("%s",p);
c)charstr[20];d)charstr[20],*p=str;
scanf("%s",&str[2]);scanf("%s",p[2]);
7.若有说明语句
chara[]="Itismine";
char*p="Itismine";
则以下不正确的叙述是________.
a)a+1表示的是字符t的地址
b)p指向另外的字符串时,字符串的长度不受限制
c)p变量中存放的地址值可以改变
d)a中只能存放10个字符
8.下面程序的运行结果是_______.
#include
#include
main()
{
char*s1="AbDeG";
char*s2="AbdEg";
s1+=2;s2+=2;
printf("%d\n",strcmp(s1,s2));
}
a)正数b)负数c)零d)不确定的值
9.下面程序的运行结果是_______.
#include
#include
fun(char*w,intn)
{chart,*s1,*s2;
s1=w;s2=w+n-1;
while(s1 } main() {char*p; p="1234567"; fun(p,strlen(p)); puts(p); } a)7654321b)1714171c)1711717d)7177171 10.已知说明语句int(*p)[];,则下列叙述正确的是: ______。 A)p是一个指针变量,它指向一个整型一维数组 B)是一个指针变量,它指向一个整型数据 C)p是一个指针变量,它指向一个返回值是整数的函数 D)以上都不对 11.若数组名作实参而指针变量作形参,函数调用实参传给形参的是: 。 A)数组的长度B)数组第一个元素的值 C)数组所有元素的值D)数组第一个元素的地址 12.已知有声明语句chars1[10]="abcde",s3[10];以下语句中能将s1中存储的字符串和s2中存储的字符串正确交换的是: ______。 A)s3=s1,s1=s2,s2=s3; B)s3[0]=s1[0],s1[0]=s2[0],s2[0]=3[0]; C)strcpy(s3[0],s1[0]),strcpy(s1[0],s2[0]),strcpy(s2[0],s3[0]); D)strcpy(s3,s1),strcpy(s1,s2),strcpy(s2,s3); 13.设intb[]={1,2,3,4},y,*p=b; 则执行语句y=*p++;之后,变量y的值为( ) A)1B)2 C)3D)4 二、填空题: 1.以下程序的功能是: 通过指针操作,找出三个整数中的最小值并输出。 请填空。 #include"stdlib.h" main() {int*a,*b,*c,num,x,y,z; a=&x;b=&y;c=&z; printf("输入3个整数: "); scanf("%d%d%d",a,b,c); printf("%d,%d,%d\n",*a,*b,*c); num=*a; if(*a>*b)______; if(num>*c)______; printf("输出最小整数: %d\n",num); } 2.下面程序段的运行结果是________. chars[80],*sp="HELLO! "; sp=strcpy(s,sp); s[0]='h'; puts(sp); 3.下面程序段的运行结果是________. charstr[]="abc\0def\0ghi",*p=str; printf("%s",p+5); 若有定义: inta[]={2,4,6,8,10,12},*p=a;则*(p+1)的值是______.*(a+5)的值是_________. 4.若有以下定义: inta[2][3]={2,4,6,8,10,12};则a[1][0]的值是_____.*(*(a+1)+0))的值是________. 5.以下程序将数组a中的数据按逆序存放,请填空。 #defineM8 main() {inta[M],i,j,t; for(i=0;i i=0;j=M-1; while(i { t=*(a+i);________;*(_______)=t; i++;j--; } for(i=0;i } 6.若有定义: inta[3][5],i,j;(且0<=i<3,0<=j<5),则a数组中任一元素可用 五种形式引用。 它们是: (1)a[i][j] (2)*(a[i]+j) (3)*(*______); (4)(*(a+i))[j] (5)*(____+5*i+j) 7.下面程序的运行结果是_________. main() {char*a[]={"Pascal","Clanguage","dBase","Coble"}; char(**p)[]; intj; p=a+3; for(j=3;j>=0;j--)printf("%s\n",*(p--)); } 8.char(*pa)[10];则pa的类型是: ______。 9.设inta[10],b[3][3];数组元素a[5]和b[1][2]分别用指针表示的形式是_____________和_____________。 10.下列程序的功能是在数组中同时查找最大元素下标和最小元素下 标,分别存放在main函数的变量max和min中,请填空 #include"stdio.h" voidfind(int*a,intn,int*max,int*min) { inti; *max=*min=0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第十 指针