参数的传递
一元运算符可发取得变量的存储地址。设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()中的变量值。
449

被折叠的 条评论
为什么被折叠?



