C语言学习——函数(含递归)

简介: C语言学习——函数(含递归)

一、函数的几点说明:


(1) 一个源文件由一个或者多个函数组成。


(2) 一个C程序由一个或者多个源文件组成。


(3) C程序的执行从 main 函数开始。


(4) 所有的子函数都是平行的。


(5) 从用户的角度看,函数分库函数和自定义函数。


(6) 函数形式:


①无参函数:主调函数无数据传送给被调函数,可带或不带返回值。


②有参函数:主调函数与被调函数间有参数传递,主调函数可将实参传送给被调函数的形参, 被调函数的数据可返回主调函数。


根据(1)(2)(3)可知,逻辑上一个C语言程序是由函数构成的,C语言程序从主函数开始执行,在主函数中调用其他函数,这些函数可能又调用别的函数,主函数执行完毕代表整个程序结束。主函数只能调用不能被调用。物理上一个程序由一个或者若干个文件(源文件)构成,函数分别放置在这些文件中。


函数定义的一般形式


无参函数的定义形式


类型标识符:


用于指定函数带回的值的类型,不写时为int型。


不带回值时可以不写。


无参函数
void PrintMesage()
{
  printf("----------Hello world----------\n");
}
void PrintMesage(void)
{
  printf("----------Hello world----------\n");
}


二、函数参数和函数的值、函数调用


形式参数和实际参数


形式参数:定义函数时函数名后面括号中的变量名


实际参数:调用函数时函数名后面括号中的表达式


几点说明:


实参可以是常量、变量或表达式。必须有确定的值。当函数调用时,将实参的值传递给形参,若是数组名,则传送的是数组首地址。


形参必须指定类型,只能是简单变量或数组,不能是常量或表达式


形参与实参类型一致,个数相同顺序相同。


若形参与实参类型不一致,自动按形参类型转换———函数调用转换


形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放


实参对形参的数据传送是值传送,也是单向传送,当被调函数的形参发生变化时,并不改变主调函数实参的值。形、实参占据的是不同的存储单元


案例:


#include <stdio.h>
void AddFunc(int x, int y);
int main(void)
{
  int a = 66, b = 88;
  printf("a=%d,b=%d\n",a,b);
  printf("a=%d,b=%d\n", &a, &b);
  AddFunc(a, b);
  printf("a=%d,b=%d\n", a, b);
  printf("a=%d,b=%d\n", &a, &b);
  return 0;
}
void AddFunc(int x, int y)
{
  x = x + 4;
  y = y + 2;
  printf("a=%d,b=%d\n", x, y);
  printf("a=%d,b=%d\n", &x, &y);
}


结果为:



函数的返回值


返回语句形式:


return(表达式);或 return 表达式;


功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数


说明:


函数的返回值,必须用 return 语句带回。


return 语句只能把一个返值传递给调用函数。


函数中可有多个return语句,执行哪一个由程序执行情况来定。


if(a>b) return(a);


else return(b);


return 后的值可以是一个表达式,如:return(x > y ? x : y);


返回值的类型为定义的函数类型,不指定的按整型处理。


如:


int   max(int x, int y) 
              float  min(float a,float b) 
              double  abc(float d1,float d2)


若 return 语句中表达式类型与函数类型不一致,则转换为函数类型。


若无return语句,遇}时,自动返回调用函数。可能返回一个不确定或无用的值 。


无返回值的函数,定义为 void 类型。


函数的调用


主调函数:主动去调用其它函数


被调函数:被其它函数所调用


函数调用的一般形式


函数名(实参表列)


说明:


实参表列:有确定值的数据或表达式


实参与形参个数相等,类型一致,按顺序一一对应,当有多个实参时,实参间用“ ,”分隔


实参表求值顺序,因系统而定(Turbo C 自右向左)


调用无参函数时,实参表列为空,但( )不能省



函数调用的方式


按函数在程序中出现的位置,有三种调用方式:


函数语句:以独立的语句去调用函数。不要求有返回值,仅完成一定的操作。

例 printstar();


printf(“Hello,World!\n”);


函数表达式:


函数返回一个确定值,以参加表达式的运算。不可用于void

例 *m=max(a,b)2;


函数参数:函数调用作为另一个函数的参数。


例 printf(“%d”,max(a,b)); /输出大数/

m=max(a,max(b,c)); /三数比大小/


对被调用函数的声明和函数原型

对被调用函数要求:


必须是已存在的函数


库函数: #include <*.h>


用户自定义函数:如果被调函数定义在主调函数之后,那么在主调函数中对被调函数作声明。


函数声明


一般形式:函数类型 函数名(形参类型 [形参名],…… );


或 函数类型 函数名();


作用:告诉编译系统函数类型、参数个数及类型,以便检验


C语言中函数声明称为函数原型。


函数定义与函数声明不同,声明只与函数定义的第一行相同。声明可以不写形参名,只写形参类型。


函数说明位置:程序的数据说明部分(函数内或外)


说明:


旧版本C中函数声明不采用函数原型,只声明函数名和函数类型。如: float add( )

函数调用之前,如果未对函数作声明,则编译系统把第一次遇到的函数形式作为函数声明,并默认为int型。即:函数类型是int型可以不作函数声明,最好作声明。


被调用函数的定义(程序)在主调函数之前,可以不加函数声明。


在所有函数定义前,已在函数外部做了函数声明,则在各主调函数中可以不加函数声明。


三、函数的嵌套调用及递归调用




函数的递归调用


递归:在函数调用过程中,直接或间接的调用自身。


递归调用方式


直接递归调用:在函数体内又调用自身


间接递归调用:当函数1去调用另一函数2时,而另一函数2反过来又调用函数1自身。


解决无终止递归调用的方法是:确定好结束递归的条件。


例子:



实战案例:


相关文章
|
24天前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
48 10
|
24天前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
43 9
|
24天前
|
C语言 开发者
【C语言】数学函数详解
在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
43 6
|
24天前
|
存储 C语言
【C语言】输入/输出函数详解
在C语言中,输入/输出操作是通过标准库函数来实现的。这些函数分为两类:标准输入输出函数和文件输入输出函数。
166 6
|
24天前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
52 6
|
7月前
|
存储 C语言
C 语言函数完全指南:创建、调用、参数传递、返回值解析
函数是一段代码块,只有在被调用时才会运行。 您可以将数据(称为参数)传递给函数。 函数用于执行某些操作,它们对于重用代码很重要:定义一次代码,并多次使用。
229 3
|
2月前
|
C语言
C语言函数返回值详解
本文详细解析了C语言中函数返回值的概念与应用。从函数的基本定义入手,深入探讨了不同类型返回值的作用及意义,并提供了实用的编程示例,帮助读者更好地理解和使用函数返回值。通过本文,你将掌握如何有效利用返回值优化代码结构与功能实现。
|
6月前
|
存储 C语言
C语言的函数返回值和指针
C|函数返回值(区分各类值)和指针(区分各类存储空间)的细节
|
C语言
C语言---函数---知识点总结(三)------函数的返回值类型
C语言---函数---知识点总结(三)------函数的返回值类型
|
7月前
|
存储 C语言
C语言中向函数传递值和从函数返回值的技术解析
C语言中向函数传递值和从函数返回值的技术解析
83 0