目录
1、指针作为函数的参数
1)引言
在C语言中,函数的参数包括形参和实参,两者的类型要保持一致。
例如:函数的参数可以是整形,实型(浮点型),字符型……
也可以是指针类型!
指针类型的函数实参为函数的地址,形参为指针。
2)引用调用机制
调用函数不能改变实参变量的值,但可改变实参指针变量所指向
的变量的值。这样的机制被称为引用调用。
采用指针调用基址时,需要在函数定义时将指针作为函数的形参,
在函数调用时把变量的地址作为实参(实参的值被赋给形参)。
2、通过交换地址来改变变量的值
!!!交换的关键:对地址进行交换,其他的都为无用功!!!
用指针变量作为函数形参的优点:可以用一个函数返回多个值
下面看3段代码:
代码段1
#include <stdio.h>
void swap1(int x,int y);
int main(void)
{
int a = 1;
int b = 2;
//定义指针变量
int *pa = &a;
int *pb = &b;
//调用函数——交换1
swap1(a,b);
//输出a,b的值
printf("%d %d",a,b);
return 0;
}
void swap1(int x,int y)
{
int temp;
temp = x;
x = y;
y = temp;
}
运行结果:
代码段2
#include <stdio.h>
void swap2(int *px,int *py);
int main(void)
{
int a = 1;
int b = 2;
//定义指针变量
int *pa = &a;
int *pb = &b;
//调用函数——交换1
swap2(pa,pb);
//输出a,b的值
printf("%d %d",a,b);
return 0;
}
void swap2(int *px,int *py)
{
int *temp;
temp = px;
px = py;
py = temp;
}
运行结果:
代码段3
#include <stdio.h>
void swap3(int *px,int *py);
int main(void)
{
int a = 1;
int b = 2;
//定义指针变量
int *pa = &a;
int *pb = &b;
//调用函数——交换1
swap3(pa,pb);
//输出a,b的值
printf("%d %d",a,b);
return 0;
}
void swap3(int *px,int *py)
{
int temp;
temp = *px;
*px = *py;
*py = temp;
}
运行结果:
思考
从上述代码中不难看出,只有交换了变量的地址,变量的值才会改变。
值得注意的是,swap2中函数只交换了形参变量的值,并不会影响实参,因此变量值不变。
而*px指向a变量,*py指向b变量,两者的值交换后相应变量的地址发生了改变,因此值改变。
注意,赋值表达式中的变量类型一定要相同。
int t ,int*px t=*px
int *t,int *px t=px
3、例题练习
输入年份和天数,输出对应的年、月、日。要求定义和调用函数month_day(int year,int
yearday,int *pmonth,int *pday),其中year是年,yearday是天数,pmonth和pday指向的
变量保存计算得出的月和日。例如,输入2000和61,输出2000-3-1,即2000年的第61天是3
月1日。
#include <stdio.h>
int month_day(int year,int yearday,int *pmonth,int *pday);
int main(void)
{
int year,yearday,month,day;
printf("输入年份和天数:");
scanf("%d %d",&year,&yearday);
//调用函数改变地址
month_day(year,yearday,&month,&day);
printf("%d-%d-%d\n",year,month,day);
return 0;
}
int month_day(int year,int yearday,int *pmonth,int *pday)
{
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条件 成立时leap=1,不成立时leap=0
leap = (year%4 == 0 && year%100 != 0)||year%400 == 0;
for(k = 1;yearday > tab[leap][k];k++){
yearday = yearday - tab[leap][k];
}
//指针赋值
*pmonth = k; //月份
*pday = yearday; //天数
}
运行结果如下:
4、本章存疑
调用函数时实参赋给形参的值是地址赋给指针变量还是地址赋给指针
以后慢慢学习研究……