C语言第十回合:函数大揭秘
【学习目标】
1. 函数的定义
2. 函数的使用
3. 函数的声明
4. 形参和实参
5. return语句
6. 函数的调用
函数:函数是包含一条或多条C语言的语句,完成程序中的部分功能的子程序。C源程序是由函数组成的。
A: 函数的分类
(一) 从函数的定义角度看:
(a) 库函数:由C系统提供,无需定义,如:printf,scanf,putchar…
(b) 用户定义函数:由用户定义的函数
(二) C语言的函数兼有其他语言中的函数和过程两种功能:
(a) 有返回值的函数:此函数执行完任务后,向调用者返回函数值
(b) 无返回值的函数:此函数完成任务后,不会向调用者返回函数值
(三) 从主调函数和被调函数之间数据的传输:
(a) 有参函数:(即带参函数)在函数定义和声明时都有参数
(b) 无参函数:函数定义、函数说明及函数调用均都不带参数
B: 函数的定义
类型 函数名称( 参数类表 ) { 声明 语句 }
(一) 无参函数的定义
类型标识符函数名() //括号内没有参数
{
函数语句体;
return (表达式); //== return表达式; 没返回值时,改为return;(即返回空)。
}
[ 1 ]无参无返回值得函数定义
//无参无返回值函数的定义
#include <stdio.h>
//无参无返回值函数的定义
//用void就表示无参数,可以不写,但是写比较规范,增强可读性
void print( void )
{
int number= 100;
printf("%d\n", number );
return ; //不返回什么。可增强可读性
}
//main()函数也定义为无参函数
int main( void )
{
//打印函数print中的number
print(); //函数的调用
return 0;
}
[ 2 ]无参又返回值函数的定义
//无参有返回值函数的定义
#include <stdio.h>
int Add( void )
{
int a= 10;
int b= 20;
return ( a+ b );//返回表达式a+ b的值
}
int main( void )
{
int sum;
sum= Add();
printf( "sum=%d\n", sum );
return 0;
}
(二) 有参函数的定义:
类型标志符函数名(参数列表)
{
函数体语句;
return(表达式);//有返回值时,此句存在。没返回值时,为return; (即返回空)。
}
[ 1 ]有参无返回值函数
//有参无返回值函数的定义
#include <stdio.h>
//有参无返回值的定义
void Add( int a, int b )
{
int sum= 0;
sum= a+ b;
printf( "%d\n", sum );
return ;
}
int main( void )
{
int n= 20;
int m= 30;
printf( "n+ m=" );
Add( n, m );
return 0;
}
[ 2 ]有参有返回值函数
//有参有返回值函数的定义
#include <stdio.h>
//有参有返回值的定义
int Add( int a, int b ) //返回类型为int
{
return ( a+ b );
}
int main( void )
{
int sum= 0;
int n= 20;
int m= 30;
sum= Add( n, m );
printf( "n+ m=%d\n", sum );
return 0;
}
C: 函数的申明
函数原型的声明就是告诉编译器预定函数名,作为以后在使用。(很像酒店的订餐,人没到先预定位置)
类型 函数名称( 参数类表 ); //这是声明,没有写函数的功能。
//函数申明
#include <stdio.h>
//有参有返回值的申明
//只声明了函数的原型,并没有定义功能
int Add( int a, int b );
int main( void )
{
intsum= 0;
intn= 20;
intm= 30;
sum=Add( n, m );
printf("n+ m= %d\n", sum );
return 0;
}
//有参有返回值的定义
int Add( int a, int b ) //返回类型为int
{
return ( a+ b );
}
D:形式参数和实际参数
(一) 形式参数:形参出现在函数的定义中,整个函数都可以使用。
(二) 实际参数:实参出现在主函数(main)中,进入被调函数后,实参就不能使用了。
PS:发生函数调用时,主函数把实参的值传送给被调用函数的形参从而实现主调函数向被调函数传送数据。
特点:
(a)形参变量只有在被调用时才分配内存单元,结束后就会释放。所以形参的作用范围只有在函数内有效。
(b) 实参可以是常量、变量、表达式、函数等,无论实参是哪种类型,在进行函数调用时,他们必须有具体的值。
(c) 实参和形参在数量上、类型上、顺序上应严格一致,否则会发生“类型不配”的错误
(d) 函数调用中的数据传送时单向的。即只能把实参的值传送给形参,而不是把形参的值方向地传送给实参。因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。
//形参和实参的讲解
#include<stdio.h>
//函数a和b都是形参
void Sub( inta, int b ) //减法
{
int sub;
sub= a- b;
printf( "a- b= %d\n", a- b);
return ; //Sub函数的结束标志
}
int main(void )
{
int n, m;
n= 30;
m= 20;
//Sub函数的调用
Sub( n, m ); //n和m都是实参
return 0;
}
E: return语句
关于return语句,前面也遇到很多,也解释了。这里再次说明一下。
格式: returnexpression;
不论有没有返回值,都写一下return语句。
有返回值时 return expression;
无返回时 return ; //虽不返回什么,但可以作为函数的结束标志。提高可读性
return语句实例
//[1]返回空
//print()函数的定义
void print( intnum ) //功能:打印整形num的值
{
printf( "%d\n", num );
return ; // 返回空。作用:增强可读性
}
//[2]返回值
//Add()函数的定义
int Add( int a,int b )
{
int sum= 0;
sum= a+ b;
return sum; //或使用return (a+ b ); //直接返回表达式的值
}
F: 函数调用
程序总是从main()函数开始执行,当程序遇到函数名时,这就是函被调用。
在函数被调用期间,实参与形参发生值传递。通过值传递的实参的值不会被调用函数中改变。
#include <stdio.h>
//定义sum函数,求 0- n之间所有数的和
int Sum( int n )
{
intsum= 0; //局部变量,函数sun调用完后sum就会被释放
for(; n> 0; n-- ) //for语句,它里面前一个表达式被省略
{
sum+=n; //sum= sum+ n;
}
returnsum;
}
int main( void )
{
intnum= 10;
printf("调用函数Sum前num= %d\n", num );
printf("0-%d之间数的和:sum=%d\n",num, Sum( num ) );
printf("调用函数Sum后num= %d\n", num );
return 0;
}
【指尖的微笑】错误在所难免,希望得到大家的指正^-^
转载时保留原文的链接http://oursharingclub.joinbbs.net/和http://blog.csdn.net/mirrorsbeyourself