指针学习 2

目录

1、指针作为函数的参数

1)引言

2)引用调用机制

2、通过交换地址来改变变量的值

代码段1

代码段2

代码段3

思考

 3、例题练习

4、本章存疑


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、本章存疑

调用函数时实参赋给形参的值是地址赋给指针变量还是地址赋给指针

以后慢慢学习研究……

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值