形参与实参之间的值传递

  • Post author:
  • Post category:其他


先说形参与实参的数值传递:

函数调用时将实参数传递给形参称为参数传递。C语言中,参数的传递方式是“单向值传递”,形参和实参变量各自有不同的存储单元,被调用函数中的形参变量值的变化不会影响实参变量值。

举个例子

#include<stdio.h>

void swap(int x,int y)

{

int z;

z=x; x=y; y=z;

}

woid main()

{

int a,b;

a=10; b=20;

swap(a,b);

printf(“a=%d\tb=%d\n”,a,b);

}

运行结果:

a=10 b=20

在调用swap()函数时,实参a 和b的值是10和20.进入被调函数时,先开辟形参单元x和y,再将a和b的值分别传递给形参变量x和y,执行swap()函数使x和y的值进行交换,但是交换的结果并不会使实参变量a和b交换,所以a和b的值仍为10和20。参数的传递方式是“单向值传递”。主要的解释就是:形参和实参变量各自有不同的存储单元,实参有一个存储空间,行参有一个存储空间,将实参单值传递给形参,在形参的存储空间里进行的运算,但是这种运算不会对实参的存储空间产生影响。

但是也有例外的情况,就是在数组作为函数参数时。

一个变量有地址,一个数组包含若干个元素,每个数组元素都在内存中占用存储单元,他们都有相应的地址。既然指针可以指向变量,也就意味着它也可以指向数组元素,即把某个元素的地址放到一个指针变量中。所以所谓数组元素的指针就是数组元素的地址。定义一个有10个元素的整形数组,int a[10]; 定义一个指向整形变量的指针变量,int *p; 若p=&a[0]或p=a; 则代表将a[0]元素的地址赋给了指针变量p。其中值得注意的是a代表的不是整个数组,而是代表数组名,C中规定数组名代表把数组中第一个元素的地址,因此a等同与&a[0];只是形式上的不同而已。在明白了基础概念之后,我们进一不看看数组名和指向数组的指针变量的应用。

将数组名作为函数参数的时候,在实参和形参之间的对应关系有以下四种:

1.形参和实参都用数组名,如

main() f(int x[].int n)

{int a[10];{

…… ……

f(a,10); }

}


由于形参数组名接受了实参数组首元素的地址,因此在函数调用期间,形参数组与实参数组共用一段内存空间。

2.实参用数组名,形参用指针变量,如

main() f(int *x,int n)

{int a[10]; {

…… ……

f(a,10); }

}

x为指向整形变量的指针变量,函数开始执行是x指向a[0],通过x值的变化,可以指向a数组的任一元素。

3.实参形参都用指针变量,如

main() f(int *x,int n)

{int a[10];,*p; {

p=a; …………

f(p,10); }

}

实参p和形参x都是指针变量,p先指向数组a,即p的值就是&a[0],然后将p的值传递给x,x的值也是&a[0],因此通过x的改变就可使x指向a的任一元素。

4.实参为指针变量,形参为数组名,如

main() f(int x[],int n)

{int a[10],*p; {

p=a;…… ……

f(p,10); }

}

实参p为指针变量,它指向a[0],形参为数组名x,但在C中将它做为指针变量来处理,所以a[0]的值也传给了x,因此也可以理解为形参数组x和a数组共用同一段内存单元。

以上内容想说明数组的传递和指针在数组中的应用,旨在说明第一种情况,注意红字,下面将进一步说明

数组名作函数的参数,必须遵循以下原则:

(1)如果形参是数组形式,则实参必须是实际的数组名,如果实参是数组名,则形参可以是同样维数的数组名或指针。

(2)要在主调函数和被调函数中分别定义数组。

(3)实参数组和形参数组必须类型相同,形参数组可以不指明长度。

(4)在C语言中,数组名除作为变量的标识符之外,数组名还代表了该数组在内存中的起始地址,因此,当数组名作函数参数时,实参与形参之间不是”值传递”,而是”地址传递”,实参数组名将该数组的起始地址传递给形参数组,两个数组共享一段内存单元,编译系统不再为形参数组分配存储单元。

例9-15:分析程序的执行过程。

#include <stdio.h>

func6 ( char str[ ] )

{ printf (“%s”,str);

}

main( )

{ char a[10]= “Turbo C”;

func6(a); /* 数组名做函数的实参 */

}

内存空间存储状态如9-5图所示。


调用时,


实参数组将首地址a 赋值给形参数组str,两个数组共同占用相同的内存单元,共享数组中的数据,a[0]与str[0]代表同一个元素,a[1]与str[1]代表同一个元素


。因此,当数组名做函数参数时,形参数组的长度与实参数组的长度可以不相同,当形参数组长度小与实参数组长度时,形参数组只取部分实参数组中的数据,实参中的其余部分可以不起作用,形参数组也可以不指明长度。