Bootstrap

形参和实参

形参(形式参数)
函数定义时指定的参数,形参是用来接收数据的,函数定义时,系统不会为形参申请内存,只有当
函数调用时,系统才会为形参申请内存。主要用于存储实际参数,并且当函数返回时,系统会自动
回收为形参申请的内存资源。(本质上所有函数都有一个 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 ;
}
;