习题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);

       }

}

上一篇:《C语言深度剖析》第三章 预处理详解 p1 C语言从入门到入土(进阶篇)


下一篇:《C语言深度剖析》第二章 符号详解 p1 C语言从入门到入土(进阶篇)