实验十八 指针的使用
实验要求:
1、掌握指针的定义;
2、理解指针的含义;
3、掌握指针的基本使用;
4、能进行程序调试,并修改程序。
特别要求:
在实验中遇到困难时,切忌不要动不动就问老师,而是应该先思考。如果确实不能解决困难,先与坐在旁边的同学讨论,而无论这个同学在以前是否认识。如果有同学问你问题,无论你是否能解决这个问题,都应该和他讨论。如果讨论了仍然不能解决问题,就一起问老师。讨论问题的好处在于能够深刻的理解问题,记住问题。
程序设计
1.阅读下面的程序,了解指向简单变量的指针p和指向多个元素的指针t的特性。并掌握他们的方法。
#include<stdio.h>
voidmain()
{
inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}},i;
int *p,(*t)[4];
p=a[0]; /*指向数组的首地址*/
t=a; /*指向数组的首地址*/
printf("p=%lu,*p=%d\n",p,*p);
printf("t=%lu,**t=%d\n",t,**t);
printf("-------------------\n");
p=p+1;
t=t+1;
printf("p=%lu,*p=%d\n",p,*p);
printf("t=%lu,**t=%d\n",t,**t);
printf("-------------------\n");
p=p-1; /*重新指向数组的首地址*/
t=t-1; /*重新指向数组的首地址*/
printf("用指针p输出数组元素:\n");
for(;p<a[0]+12;p++)
printf("%d ",*p);
printf("\n用指针t输出数组元素:\n");
for(;t<a+3;t++)
for(i=0;i<4;i++)
printf("%d ",*(*t+i));
}
/*p11_1.c*/
|
2,月份的中英文转换
题目描述
编写程序,在主函数中定义含有12个指针的指针数组,使它的12个元素分别指向由月份组成的字符串常量(January 、February 、March 、April、May、June、July、August、September、October、November、December)。设计一个循环,根据键盘输入的数字月份(1-12),输出相应的月份字符串。若输入错误,则输出"Error"
输入描述
每个用例是一个整数。
输出描述
若该整数为1-12之间,则输出其对应的英文月份,否则输出“Error”。以换行结束。
样例输入
1
12
15
样例输出
January
December
Error
/*p11_2.c*/ #include <stdio.h>
int main() { char *a[]={"January","February","March","April", "May","June","July","August","September", "October","November","December"}; int n; scanf("%d",&n); if(n<1 || n>12) printf("Error\n"); else printf("%s\n",a[n]); } |
3、字符串中找最大字符
题目描述
编写一个函数char fact(char *p),功能是找字符串中ASCII码最大的哪个字符。
在主函数中输入一个字符串,串长不超过80个字符,调用函数fact,找出最大字符,并在主函数中输出。
输入描述
输入一个字符串
输出描述
串中最大的字符
样例输入
Waf89KZ
样例输出
f
/*p11_3.c*/ #include <stdio.h>
int main() { char fact(char *p); char a[81],z; gets(a); z=fact(a); printf("%c\n",z); }
char fact(char *p) { int i; char a; a=p[0]; for(i=0;p[i]!='\0';i++) { if(p[i]>a) a=p[i]; } return a; } |
4、复制一维数字(指针)
题目描述
编写一个程序,初始化一个int数组source[5],然后把数组内容复制到另外两个数组target1[5]和target2[5]中。制作第一份拷贝的函数void copy_arr(,int source[], int tar1[])使用数组符号。制作第二份拷贝的函数voidcopy_ptr(int source[],int *tar2)使用指针符号,并使用指针的增量来操作。
输入描述
一个int数组source[5]
输出描述
输出“target1:X X X X X”和“target2:X X X X X”,各占一行
样例输入
10 24 11 30 38 42
样例输出
target1:10 24 11 30 38 42
target2:10 24 11 30 38 42
/*p11_4.c*/ #include <stdio.h> #include <stdlib.h> void main() { void copy_arr(int source[],int tar1[]); void copy_ptr(int source[],int *tar2); int source[5],i,tar1[5],*tar2; tar2=(int *)malloc(sizeof(int)*5); for(i=0;i<5;i++) { scanf("%d",&source[i]); } copy_arr(source,tar1); copy_ptr(source,tar2); printf("target1:"); for(i=0;i<5;i++) { printf("%d ",tar1[i]); } printf("\n"); printf("target2:"); for(i=0;i<5;i++) { printf("%d ",tar2[i]); } printf("\n"); } void copy_arr(int source[],int tar1[]) { int i; for(i=0;i<5;i++) tar1[i]=source[i]; } void copy_ptr(int source[],int *tar2) { int i; for(i=0;i<5;i++) tar2[i]=source[i]; } |
5、字符串的比较(指针版)(不能调用现有的比较函数)
题目描述
从键盘输入任意两个字符串s1和s2,其长度都不超过100。比较字符串的大小(字符串比较是从左到右逐位比较),如果s1>s2,输出1;s1=s2,输出0;s1<s2,输出-1。编写函数实现该功能。
int strcmpa(const char *s1,const char *s2)
在主函数中调用这个函数,进行验证。
输入描述
每个测试用例占两行,包含2个字符串。
输出描述
对应每个测试用例,输出一个整数,表示比较的结果;
样例输入1
C++
Program
样例输出1
-1
样例输入2
student
student
样例输出2
0
/*p11_5.c*/ #include <stdio.h> #include <string.h> int main() { int strcmpa(const char *s1,const char *s2); char s1[100],s2[100]; int f; gets(s1); gets(s2); f=strcmpa(s1,s2); printf("%d\n",f); }
int strcmpa(const char *s1,const char *s2) { if(strcmp(s1,s2)>0) return 1; else if(strcmp(s1,s2)==0) return 0; else return -1; } |
6、删除升序数组中的重复元素(指针版)
题目描述
编写程序,在被调函数中删去一维数组中所有相同的数,使之只剩一个,数组中的数已按由小到大的顺序排列,被调函数返回删除后数组中数据的个数。
int unique(int *pArr,int num),pArr和num分别为数组首地址和数组元素的个数。
函数实现的功能如下:
原数组:2 2 2 3 4 4 5 6 6 6 67 7 8 9 9 10 10 10
删除后:2 3 4 5 6 7 8 9 10
输入描述
无
输出描述
输出删除重复元素以后的升序序列。各个元素以空格隔开,最后以换行结束。
样例输入
无
样例输出
2 3 4 5 6 7 8 9 10
/*p11_6.c*/ #include <stdio.h> #include <string.h> int main() { int unique(int *pArr,int num); int a[]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10}; int num,i,f; f=unique(a,19); for(i=0;i<=f;i++) { printf("%d ",a[i]); } printf("\n"); return 0; } int unique(int *pArr,int num) { int i,j; for(i=0,j=0;i<num;i++) { if(pArr[j]!=pArr[i]) { ++j; pArr[j]=pArr[i];
} } return j; } |
总结(本次实验遇到的问题、解决方法,今后要注意的地方)
1 数组名要对应。
2 函数调用中指针要用名称加*就表示值而不是指针