函数参数及其传递方式 1. 形参与实参 • 实际参数(简称实参): 调用函数时函数名后面括号中的表达式 • 形式参数(简称形参): 定义函数时函数名后面括号中的变量名 • 说明: void main( )/*求三个整数之和*/ { int threesum( ) ; int a, b, c, sum ; scanf(“%d,%d ,%d”, &a,

Download Report

Transcript 函数参数及其传递方式 1. 形参与实参 • 实际参数(简称实参): 调用函数时函数名后面括号中的表达式 • 形式参数(简称形参): 定义函数时函数名后面括号中的变量名 • 说明: void main( )/*求三个整数之和*/ { int threesum( ) ; int a, b, c, sum ; scanf(“%d,%d ,%d”, &a,

Slide 1

函数参数及其传递方式
1. 形参与实参
• 实际参数(简称实参): 调用函数时函数名后面括号中的表达式
• 形式参数(简称形参): 定义函数时函数名后面括号中的变量名
• 说明:
void main( )/*求三个整数之和*/
{ int threesum( ) ;
int a, b, c, sum ;
scanf(“%d,%d ,%d”, &a, &b, &c);
sum=threesum(a, b, c);
printf(“sum is %d \ n”, sum);
}
int threesum(int x, int y, int z)
{ int w ;
w=x+y+z ;
return(w);
}

– 实参必须有确定的值
– 形参必须指定类型
– 形参与实参类型一致,个数
相同
– 若形参与实参类型不一致,
自动按形参类型转换———
函数调用转换
– 形参在函数被调用前不占内
存;函数调用时为形参分配内
存;调用结束,内存释放
上一页

1
下一页 返回上一级


Slide 2

例、计算 x3
#include
不确定值
1.2
a
形参
float cube(float x)
不确定值
product 1.728
{ return(x*x*x);
x
1.2
}
返回值
实参
main()
分配变量存储空间
{ float a, product;
printf("Please input value of a:");
scanf(“%f”,&a); /* 输入1.2 给a */
product=cube(a);
printf(”Cube of %.4f is %.4f\n",a,product);
}
在定义函数中指定的形参,在未出现函数调用时,它们并不
在不同的函数之间传递数据,可以使用的方法:
占内存中的存储单元。只有在发生函数调用时,函数cube中
◆ 参数:通过形式参数和实际参数
的形参x才被分配内存单元。在调用结束后,形参x
所占的内
◆ 返回值:用return语句返回计算结果
存单元也被释放。
◆ 全局变量:外部变量
上一页

2
下一页 返回上一级


Slide 3

2. 参数传递方式
有两种

值传递方式
地址传递方式

(1) 赋值传递方式
– 方式:函数调用时,为形参分配单元,并将实参的值复
制到形参中;调用结束,形参单元被释放,实参单元
仍保留并维持原值。
– 特点:
» 若实参是变量: 形参与实参占用不同的内存单元,
实参变量的值传递给形参变量。
若实参是常量或表达式: 实参的常量值或表达式值
传递给形参变量。
» 赋值传递方式是单向值传递。
上一页

3
下一页 返回上一级


Slide 4

例、交换两个数

实参是变量: 形参与实参占用不同的内存
单元,实参变量的值传递给形参变量

#include

void main( )
{ int x=7,y=11;
printf("x=%d,\ty=%d\n",x,y);
printf("swapped:\n");
swap(x,y);
printf("x=%d,\ty=%d\n",x,y);
}
swap(int a, int b)
{ int temp;
temp=a; a=b; b=temp;
}

调用前:

x:

7

y:

11

x:

7

y:

11

实参值传递给形参

调用时:

swap:

a:

7

b:

11

x:

7

y:

11

a:

11

b:

7

temp
调用结束:

x:

7

上一页

7
y:

11

4
下一页 返回上一级


Slide 5

例、交换两个数
#include

void main( )
{ int y=10;
printf("x=%d,\ty=%d\n",x,y);
printf("swapped:\n");
swap(7, y+1);
printf("x=%d,\ty=%d\n",x,y);
}

实参是常量或表达式: 实参的常量
值或表达式值传递给形参变量
调用前:

y:
7

y+1

实参值传递给形参

调用时:
a:
swap:
a:

swap(int a, int b)
{ int temp;
temp=a; a=b; b=temp;
}

7

b:

11

7

y:

11

11

b:

7

temp

调用结束:

11

7
上一页

7
y:

11

5
下一页 返回上一级


Slide 6

(2) 赋地址传递方式
– 方式:函数调用时,将数据的存储地址作为参数传
递给形参
– 特点:
» 若实参是变量: 形参与实参占用不同的内存单元,
地址值传
实参变量的地址值传递给形参变量。
递仍然是
若实参是常量或表达式: 实参的常量地址值或表
单向值传
达式的地址值传递给形参变量。

» 形参与实参指向相同的存储单元
形参和实
» 由于形参与实参指向共同的存储单元,通过形参
参的地址
改变其所指向的数据单元的数据,在主调函数中
值指向同
可以通过实参访问,从而达到数据“双向”传递
一区域
的作用(参见接下来的例子)
» 实参和形参必须是地址数据(地址变量、常量或
表达式)
6
上一页

下一页 返回上一级


Slide 7

#include

若实参是常量或表达式: 实参的常量地
例、交换两个数
址值或表达式的地址值传递给形参变量

swap(int *p1, int *p2)
{ int p;
p=*p1; 通过指针变量接受地址值
*p1=*p2;
*p2=p;
*p2含义:访问p2指向的
}
存储空间

调用前:

a
5
实参&a
形参p1

&a
调用swap:
实参地址值传递给形参

形参p2

&b

实参&b
void main( ) 传递a、b的地址值
p1
{ int a,b;
&a
scanf("%d,%d",&a,&b);
由于形参与实参指向共同的
通过形参交换:
printf(“a=%d,b=%d\n”,a,b);
p2
存储单元,通过形参改变其
printf(“swapped:\n”);
&b
所指向的数据单元的数据,
swap(&a,&b);
在主调函数中可以通过实参
a
printf(”a=%d,b=%d\n",a,b);
返回:
访问,所以达到数据“双向”
9
}传递的作用
上一页

b
9
a
5
b
9
a
9
b
5

b
5
7
下一页 返回上一级


Slide 8

#include
文件包含编译预处理命令
long sum(int a, int b);
函数类型说明
long factorial(int n);
main()
{ int n1,n2;
long a;
long factorial(int n)
long sum(int a, int b);
{ long rtn=1;
scanf("%d,%d",&n1,&n2);
int i;
a=sum(n1,n2);
函数调用
实参
for(i=1;i<=n;i++)
printf("a=%1d",a);
rtn*=i;
}
函数定义
return(rtn);
long sum(int a,int b)
}
形参
{ long factorial(int n);
long c1,c2;
c1=factorial(a);
函数调用
c2=factorial(b);
return(c1+c2);
函数返回值
8
上一页
下一页 返回上一级
}