函数的参数

参数的传递

一元运算符可发取得变量的存储地址。设pool 是一个变量的名字,那么&pool 就是变量的地址。一个变量的地址可发看作是该变量的在内存中的地址。例:

以下的语句:

Pool=24; 

并且假定pool的存储地址为0B78;那么语句:

Printf(“%d%p\n”,pool,&pool);

将输出以下数值:(%p是输出地址的说明符)

24 0B78

如例:

#include<stdio.h>
#include<stdlib.h>
void interchange(int u,int v);
int main(void)
{
	int x=5,y=10;
	printf("Originally x =%d and y=%d\n",x,y);
	interchange(x,y);
	printf("nows x =%d and y=%d\n",x,y);
	system("pause");
	return 0;


}
void interchange(int u,int v)
{
	int temp;
	temp=u;
	u=v;
	v=temp;
}

基输出结果:


 可知,其输出结果并没有交换。

若输出结果即printf();两个函数的子函数中显示,那么其值就会交换。即:

interchange()改为:

void interchange(int u,int v)
{
	int temp;
	printf("Originally u =%d and v=%d\n",u,v);
	temp=u;
	u=v;
	v=temp;
	printf("nows u =%d and v=%d\n",u,v);
}

结果:



可知函数interchange()并没有错误,u 和v 的值确实得到了交换。问题出现在把执行结果传递给函数main()的时候。Interchange()使用的就是独立于函数main();因此交换u 和v 的数值对x 和 y 没有任何影响。

 应该怎样解决?指针。

指针是其数值为为地址的变量。

用指针解决函数间的通信问题:

#include<stdio.h>
#include<stdlib.h>
void interchange(int *u,int *v);
int main(void)
{
	int x=5,y=10;
	printf("Originally x =%d and y=%d\n",x,y);
	interchange(&x,&y);
	printf("nows x =%d and y=%d\n",x,y);
	system("pause");
	return 0;
}
void interchange(int *u,int *v)
{
	int temp;
	temp=*u;
	*u=*v;
	*v=temp;
}

结果:


 

 函数调用语句如下:

Interchange(&x,&y);

函数传递的是地址而不是它们的值。意味着interchange()函数原型声明和定义中的形式参数u 和 v 将使用地址作为它们的值。因此,应该声明为指针。由于x 和 y 都是整数,所以u和v 是指向整数的指针。其声明如下:

Void interchange(int * u,int *v);

接下来,函数体进行如下声明:

Int temp;

从而提供所需的临时变量。

 

在ANSI原型中可以省略变量名称。这样,函数原型可以进行如下声明:

Void interchange(int*,int*);

 

Function1(x);//这时是传递x的值。

Function2(&x);//这时是传递x 的地址。

第一种调用形式要求函数定义部分必须包含一个和x 具有相同数据类型的形式参数。

Function1(int num);

第二种调用形式要求函数定义部分必须是指向相应数据类型的指针:

Function2(int *ptr);

要使用函数进行数据操时,可以使用第一种形式,但是,如果需要改变调用函数中的多个变量的值时,就需要用到第二种形式。

总之,interchange()只是使用局部变量,但是通过指针,该函数可以操作main()中的变量值。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                                                                                                                                             

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值