例8-3:有两个角色分别用变量a和b表示。
//通过函数调用来交换变量值 的示例程序
#include<stdio.h>
void s1(int x,int y),s2(int *px,int *py),s3(int *px,int *py);
int main()
{
int a=1,b=2;
int *pa=&a,*pb=&b;
s1(a,b);//使用变量a b调用函数s1()
//s1被调用时,实参a b的值传递给了形参x y,在s1中实现了x y的交换
//但当返回主调函数后,s1中定义的变量都销毁了,而主调函数的a b的值没有任何改变
printf("After calling s1: a=%d, b=%d\n",a,b);
a=1;b=2;
s2(pa,pb);//使用指针pa pb调用函数s2()
printf("After calling s2: a=%d, b=%d\n",a,b);
a=1;b=2;
s3(pa,pb);//使用指针pa pb调用s3()
printf("After calling s3: a=%d, b=%d\n",a,b);
return 0;
}
void s1(int x,int y)
{
int t;
t=x;x=y;y=t;
}
void s2(int *px,int *py)
{
int t;
t=*px;*px=*py;*py=t;//交换了pa pb指向的变量
}
void s3(int *px,int *py)
{
int *pt;
pt=px;px=py;py=pt;//交换了pa pb
}
例8-4:输入年份和天数,输出对应的年月日。
//使用指针作为函数参数 返回多个函数值的示例
#include<stdio.h>
void month_day(int year,int yearday,int *pmonth,int *pday);
int main()
{
int day,month,year,yearday;//定义代表日 月 年 和天数的变量
printf("input year and yearday: ");//提示输入数据:年 天数
scanf("%d%d",&year,&yearday);
month_day(year,yearday,&month,&day);//调用函数计算月日,这里用了& &
//p=&a; 表示把变量 a的地址赋给指针 p,即 p指向 a
printf("%d-%d-%d\n",year,month,day);
return 0;
}
void month_day(int year,int yearday,int *pmonth,int *pday)
//函数的参数包括实参和形参。如果将某个变量的地址 作为函数的实参,相应的形参就是指针
//将变量month和day的地址作为实参,在被调函数中 用形参指针pmonth和pday分别接收地址,并改变了形参所指向变量的值
//所以month和day中的值也随之改变
{
int k,leap;
int tab[2][13]= //定义数组存放非闰年和闰年每个月的天数
{
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
leap=(year%4==0&&year%100!=0)||year%400==0;//建立闰年判别条件leap
for(k=1;yearday>tab[leap][k];k++)
yearday=yearday-tab[leap][k];
*pmonth=k; //对指针 p所指的变量进行赋值
*pday=yearday;
}
练习8-2:调用函数求两个数的和与差。
#include <stdio.h>
void sum_diff( float op1, float op2, float *psum, float *pdiff );
int main()
{
float a, b, sum, diff;
scanf("%f %f", &a, &b);//输入两个数
sum_diff(a, b, &sum, &diff);//调用函数
printf("The sum is %.2f\nThe diff is %.2f\n", sum, diff);
return 0;
}
void sum_diff( float op1, float op2, float *psum, float *pdiff )
{
float sum,diff;
sum=op1+op2;
diff=op1-op2;
*psum=sum;
*pdiff=diff;
}
这个在拼题网上有,代码区就只用函数的定义那部分。