形参(形式参数)
函数定义时指定的参数,形参是用来接收数据的,函数定义时,系统不会为形参申请内存,只有当
函数调用时,系统才会为形参申请内存。主要用于存储实际参数,并且当函数返回时,系统会自动
回收为形参申请的内存资源。(本质上所有函数都有一个
return
,只不过当我们的函数返回类型是
void
类型的时候,
return
是隐式)
//
关于默认
return
void
fun1
()
{
//
此时
return;
是不建议写出来的,这时候的
return;
隐式的
}
int
fun2
()
{
//
此时默认为
return 0;
这里建议写出来
}
//
关于函数的跳出处理
void
fun3
(
int
n
)
{
if
(
n
%
2
==
0
)
{
printf
(
"%d
是偶数
!\n"
,
n
);
return
;
}
printf
(
"%d
是奇数!
\n"
,
n
);
}
int
fun4
(
int
n
)
{
if
(
n
%
2
==
0
)
{
printf
(
"%d
是偶数
!\n"
,
n
);
return
-
1
;
}
printf
(
"%d
是奇数!
\n"
,
n
);
return
0
;
}
实参(实际参数)
函数调用时主调函数传递的数据参数(常量、符号常量、变量、表达式
...
,只要有确定的值),
实参就是传递的数据。
实参和形参必须类型相同,如果不同时,按赋值规定进行类型转换。
在
C
语言中,参数传递必须遵循
单向值传递
,实参只是将自身的值传递给形参,而不是实参本
身。形参的值的改变不会影响实参。
int
fun
(
int
n
)
{
printf
(
"%d\n"
,
n
);
// 10
}
int
main
()
{
int
a
=
10
;
fun
(
a
);
//
这里的意思是,只是将
a
的值拷贝了一份副本传递给了形参
n
a
=
20
;
}
实参与形参在内存中占据不同的内存空间,(建议实参和形参名称是一样的)
double
fun
(
double
a
,
double
b
)
{
return
a
+
b
;
}
int
main
()
{
int
x
=
12
,
y
=
13
;
int
c
=
(
int
)
fun
(
12
,
13
);
//
通过案例:传参时,我们将
int
类型赋值给
double
类型,此时程序不报错,因为符合自动类型转换的规
则
//
通过案例:返回时,我们将
double
类型赋值给
int
类型,此时将满足强制类型转换的条件,需要手动转
换
}
案例
案例
1
:
需求:输入两个整数,要求用一个函数求出最大数
代码:
#include <stdio.h>
/**
*
定义一个函数,求两个数中的最大数
* @param x,y
:外部传入的整数
* @return
最大值
*/
int
max
(
int
x
,
int
y
)
{
return
x
>
y
?
x
:
y
;
}
int
main
(
int
argc
,
char *
argv
[])
{
int
a
,
b
,
c
;
printf
(
"
请输入第
1
个数:
\n"
);
if
(
scanf
(
"%d"
,
&
a
)
!=
1
)
{
//
清除缓冲
while
(
getchar
()
!=
'\n'
);
printf
(
"
输入有误
!\n"
);
return
-
1
;
}
printf
(
"
请输入第
2
个数:
\n"
);
if
(
scanf
(
"%d"
,
&
b
)
!=
1
)
{
//
清除缓冲
while
(
getchar
()
!=
'\n'
);
printf
(
"
输入有误
!\n"
);
return
-
1
;
}
//
求最大值
c
=
max
(
a
,
b
);
printf
(
"%d,%d
中的最大值是
%d\n"
,
a
,
b
,
c
);
return
0
;
}
函数的返回值
若不需要返回值,函数可以可以没有
return
语句。
//
这种写法,没有返回值
return;
void
fun1
()
{
}
//
这种写法,有返回值,返回
return 0
int
fun2
()
{
}
//
这种写法,有返回值,返回
return 0
fun3
()
//
返回类型标识符如果不写,默认是
int
{
}
一个函数中可以有多个
return
语句,但任一时刻只有一个
return
语句被执行。
int
eq
(
int
num
)
{
if
(
num
%
2
==
0
)
{
printf
(
"%d
是偶数
\n"
,
num
);
return
0
;
}
printf
(
"%d
是奇数
\n"
,
num
);
return
0
;
}
被调函数返回给主调函数的结果数据(可以是变量、常量、表达式
...
,只要是确定值就可以了)
int
fun1
(
int
a
,
int
b
)
{
return
a
+
b
;
//
返回表达式,表达式的结算结果是
int
}
int
fun2
(
int
num
)
{
if
(
num
%
2
==
0
)
return
0
;
return
-
1
;
//
返回常量
}
返回值类型一般情况下要和函数中
return
语句返回的数据类型一致,如果不一致,以函数定时
指定的返回类型为标准。也就是返回值类型和实际返回值的类型可以存在转换转换关系,一般
是将
返回值类型
转
返回类型
。
案例
需求:输入两个整数,要求用一个函数求出最大值
案例
1
:
#include <stdio.h>
/**
*
定义一个函数,求两个数中的最大数
* @param x,y
:外部传入的整数
* @return
最大值
*/
int
max
(
int
x
,
int
y
)
{
if
(
x
>
y
)
return
x
;
return
y
;
}
int
main
(
int
argc
,
char *
argv
[])
{
int
a
,
b
,
c
;
printf
(
"
请输入第
1
个数:
\n"
);
if
(
scanf
(
"%d"
,
&
a
)
!=
1
)
{
//
清除缓冲
while
(
getchar
()
!=
'\n'
);
printf
(
"
输入有误
!\n"
);
return
-
1
;
}
printf
(
"
请输入第
2
个数:
\n"
);
if
(
scanf
(
"%d"
,
&
b
)
!=
1
)
{
//
清除缓冲
while
(
getchar
()
!=
'\n'
);
printf
(
"
输入有误
!\n"
);
return
-
1
;
}
//
求最大值
c
=
max
(
a
,
b
);
printf
(
"%d,%d
中的最大值是
%d\n"
,
a
,
b
,
c
);
return
0
;
}