习题11(指针)
1、读程序题:对以下程序语句分析输出语句的输出,并对错误的语句分析其错误原因。
#include <stdio.h>
void main()
{
int x=12,a[3]={1,5,8},*p1=&x,**p2=&p1,*p3[3]={&x,a,a+1};
float y=9.9,*p4=&y;
char s[]="fighting!",*ps=s;//去掉s前面的&
printf("%d,%d,%d,%d\n",x,*p1,**p3,**p2);//12,12,12,12
printf("%d,%d,%d\n",*a,*p3[1],*(*(p3+1)));//1,1,1
printf("%d,%d,%d\n",*(a+1),*p3[2],**(p3+2));//5,5,5
printf("%.1f,%.1f,%.1f\n",y,*p4,*&y);//9.9,9.9,9.9
++ps;
printf("%c,%c\n",*s,*ps++);//f,i
printf("%d,%d\n",ps-s,ps==s+2);//2,1
printf("%c\n",*s+1);//*s++ 常量不能自加
printf("%x",p1+p2);//地址不能相加,没意义。
}
2、程序改错题:以下程序功能是任意输入三个整数按大到小的顺序输出。
#include <stdio.h>
void main()
{
void sort3(int *q1,int *q2,int *q3);
int a,b,c,*p1,*p2,*p3;
printf("请输入三个整数:");
scanf("%d%d%d",&a,&b,&c);
p1=&a;p2=&b;p3=&c;
sort3(p1,p2,p3);
printf("大到小是:%d %d %d\n",a,b,c);
}
void swap(int *pt1,int *pt2)
{
int temp;
temp=*pt1;
*pt1=*pt2;
*pt2=temp;
}
void sort3(int *q1,int *q2,int *q3)
{
void swap(int *pt1,int *pt2);
if(*q1<*q2) swap(q1,q2);
if(*q1<*q3) swap(q1,q3);
if(*q2<*q3) swap(q2,q3);
}
3、编写函数pfact:功能为求任意一个正整数的阶乘,结果用指针变量的方式传回。
编程实现:求n!。
#include <stdio.h>
void pfact(int n,long *pn)
{
int i;
for(i=1,*pn=1;i<=n;i++)
{
*pn=*pn*i;
}
}
void main()
{
int x,len;
long *plen=&len;
printf("请输入一个正整数:");
scanf("%ld",&x);
pfact(x,plen);
printf("%d!是:%ld",x,len);
}
4、编写函数pflower:功能为判断一个数是否是水仙花数。水仙花数指的是一个三位正整数,其每一位的数字的立方之和等于其本身。如153= +水仙花数。形参要求是指针变量。
编程实现:输出所有的水仙花数。
#include <stdio.h>
#include <math.h>
int pflower(int n,int *pm)
{
int a,b,c;
a=n/100;
c=n%10;
b=(n-100*a-c)/10;
if(n==pow(a,3)+pow(b,3)+pow(c,3))
*pm=1;
else
*pm=0;
}
void main()
{
int i,len,*plen=&len;
printf("输出三位数的水仙花数:");
for(i=100;i<1000;i++)
{
pflower(i,plen);
if(len==1)
printf("%d ",i);
}
}