实验七 指针(参考答案)
1、设计程序sy7-1.c,有三个整形变量i,j,k。设置三个指针变量p1,p2,p3,分别指向i,j,k。然后通过指针变量使i,j,k三个变量的值顺序交换,即原来i的值赋给j,把j的原值赋给k,把k的原值赋给i。i,j,k的原值由键盘输入,要求输出i,j,k的原值和新值。 算法分析:
以前能实现两个数的交换,现在换为3个数的交换。算法应先将k的值赋给中间变量,然后依次将j赋给k,i赋给j,最后将保存在中间变量中的k赋给i;用指针实现,就是去访问每个变量都用指向该变量的指针去间接访问。 参考答案:
# include
运行结果:
2、设计程序sy7-2.c,已知数组{1,3,5,7,9},在其中分别用下标法、地址法和指针法访问数组元素,将它们输出。 算法分析:
指针p指向了一维数组a,则对数组元素的访问可以有如下几种方式:a[i],p[i],*(a+i),*(p+i) 参考答案:
# include
printf(\*(a+i)); printf(\指针法*p: \ for(p=a;p
3、设计程序sy7-3.c,利用字符指针编程,要求在一行文字:“I have 50 Yuan.”中,删去字符‘0’,使其变成:“I have 5 Yuan.”,并输出结果。 算法分析:
将字符串保存在字符数组中,然后令两个字符指针p、q变量同时指向该字符数组,p指针逐一去遍历字符串直到’\\0’结束,遍历过程中,p的目标单元只要不是要被删除的字符就把它赋给q的目标单元,赋一次值q++一次。循环完,给被删除‘0’字符的新串添上结束标志’\\0’,最后输出新串。 参考答案:
# include
char str[]=\ char *p,*q; //定义两个字符指针
p=q=str; //两个字符指针都指向字符串str while(*p!='\\0') //p的目标单元等于'\\0'循环结束
{ if(*p!='0') //如果p的目标单元不为要被删除的字符'0' {*q=*p;q++;} //就把它赋值给q的目标单位 p++; //赋值一次,p后移一个存储单元 }
*q='\\0'; //给新的字符串添加结束标志'\\0' printf(\删除0字符后的字符串 : %s\\n\}?? 运行结果
4、 设计程序sy7-4.c,要求输入三行字符(每行不超过80个字符)存于二维字符数组中,统计出其中大写字母、小写字母、空格及其它字符的个数。(要求使用指向一维数组的
指针变量) 算法分析:
遍历二维字符数组与遍历二维字符数组的方式基本相同,都要用双重循环,内循环访问每一行时,结束的标志为该行字符串的结束标志’\\0’;另外需要用到指向一行的字符指针变量去遍历和访问每个元素。 参考答案:
# include
char ch,s[3][80],(*p)[80]; //p为指向一维数组的行指针变量 int i,j,lower=0,uppr=0,space=0,other=0; printf(\请输入3个字符串:\\n\
for(i=0;i<3;i++) //等待从键盘接收3个可以带空格的字符串 gets(s[i]); //分别赋给s[i],s[i]-第i行的首地址 p=s;
for(i=0;i<3;i++) //分别从0行到第2行
for( j=0 ; ( ch=*(*(p+i)+j)) != '\\0' ; j++ )//*(*(p+i)+j))等同于p[i][j]和a[i][j] //每行访问到当前行的结束标志即'\\0'结束 if(ch>='A' && ch<='Z') uppr++; //当前字符为大写字母,uppr++; else if(ch>='a' && ch<='z') lower++;//当前字符为小写字母,lower++; else if(ch==' ') space++; //当前字符为空格,space++; else other++; //否则,other++; printf(\小写字母个数: %d\\n\ printf(\大写字母个数 : %d\\n\ printf(\空格的个数: %d\\n\ printf(\其它字符个数 : %d\\n\}?? 运行结果