C语言函数详解

目录

1.C语言中函数分类:

1.库函数

2.自定义函数

2.函数参数和函数返回值

1.形式参数和实际参数

2.函数的返回值

3.函数的调用

1.函数声明

2.函数调用的一般形式

3.函数调用的方法

4.函数的嵌套调用

4.函数的递归调用


1.C语言中函数分类:

1.库函数

为什么会有库函数?
1. 当我们需要在屏幕上打印程序运行结果的时候我们需要使用printf函数(库函数)进行打印。
2. 在编程的过程中我们会频繁的做一些字符串的拷贝工作( strcpy )。
3. 在编程是我们也计算,总是会计算 n k 次方这样的运算( pow )。
像上面我们描述的基础功能,它们不是业务性的代码。我们在开发的过程中每个程序员都可能用的到,为了支持可移植性和提高程序的效率,所以 C 语言的基础库中提供了一系列类似的库函数,方便程序员 进行软件开发。
那怎么学习库函数呢?
这里我们简单的看看: www.cplusplus.com
感兴趣的可以去看看。
注:
使用库函数,必须包含 #include 对应的头文件。

 

2.自定义函数

自定义函数和库函数一样,有函数名,返回值类型和函数参数。
但是不一样的是这些都是我们自己来设计,这给程序员一个很大的发挥空间。
函数的组成:
int fun_name(part1)
{
 statement;//语句项
}
int 为返回类型
fun_name 函数名
part1    函数参数

2.函数参数和函数返回值

1.形式参数和实际参数

(1)在定义函数时,函数名后面括号中的变量为形式参数(形参)。

(2)在主调函数中,函数名后面括号中的参数(可以是一个表达式)为实际参数(实参)。

注:

1.实参可以是常量,变量或表达式

2.在被定义的函数中必须指定形参类型

3.实参与形参的类型应相同或赋值相兼容

4.在内存中,实参单元与形参单元是不同的储存单元,只能由实参传给形参即单向传递

5.在调用函数时,给形参分配存储单元,并将实参对应的值传递给该存储单元。调用结束后,形参单元被释放,实参单元仍保留并维持原值。

2.函数的返回值

(1)函数的返回值就是通过函数调用使主调函数能得到一个确定的值。

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

(3)return 语句中的表达式值的类型必须与函数首部所说明的类型一致。如果不一致,则以函数值的类型为准,由系统自动进行强制转换。

(4)当函数没有指明返回值,或没有返回语句时,函数返回一个不确定的值,为了使函数不返回任何值,可以使用void定义无类型函数。

举一个例子:
写一个函数(get_max)可以找出两个整数中的最大值。
#include <stdio.h>
                                //get_max函数的设计
int get_max(int x, int y) //  get_max前的int为函数的返回类型;
{                         
 return (x>y)?(x):(y);   //x是否大于y如果是返回x如果不是返回y;
}
                        //调用结束后,形参单元被释放也就是数据无了,实参单元仍保留并维持原值。

int main()               //实参与形参的类型应相同或赋值相兼容,num1与num2为int类型
                         //所以接收它们的x与y也是int类型。x与y是形参。
{
 int num1 = 5;
 int num2 = 10;
 int max = get_max(num1, num2);  //num1与num2是函数实参,用逗号隔开;
 printf("max = %d\n", max);

 return 0 ;
}

3.函数的调用

1.函数声明

(1) 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数
声明决定不了。
(2) 函数的声明一般出现在函数的使用之前。要满足先声明后使用
(3)函数的声明一般要放在头文件中

2.函数调用的一般形式

一般形式:函数名(实参);

函数调用可分为调用无参函数和调用有参函数两种:

(1)调用无参函数,不用加实参,但括号不能省略;

(2)调用有参函数时,若有多个实参,各参数间用逗号隔开。实参与形参类型要一致。

3.函数调用的方法

(1)函数语句:把函数调用作为一个语句,这时该函数只需要完成一定的操作而不必有返回值。

(2)函数表达式:一个函数出现在一个表达式中,要求有一个确定的返回值提供给表达式。

(3)函数参数:函数调用作为一个函数的实参。

 调用函数和被调用函数之间的数据传递方式:

1.实参与形参之间进行数据传递。

2.通过return语句把函数返回到主调函数中。

3.通过全局变量

4.函数的嵌套调用

函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。

注: 函数可以嵌套调用,但是不能嵌套定义。

#include <stdio.h>

void new()
{
 printf("你好\n");
}

void hello()
{
    int i = 0;
 for(i=0; i<3; i++)
   {
        new();
   }
}

int main()  //程序入口
{          
 hello();   //开始调用hello()函数,后进入for循环,调用3次new()函数,
 return 0;  //new函数功能为打印你好;
 }

4.函数的递归调用

在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。

递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接 调用自身的 一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解, 递归策略 只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

使用递归法解决问题,须符合的条件:

(1)可以把要解决的问题转化成一个新的问题。而这个新的问题的解决方法与原来的解决方法相同,只是所处理的对象有规律的递增或递减。

(2)存在限制条件,当满足这个限制条件的时候,递归便不再继续。
#include <stdio.h>

void print(int n)    //n=1234
{
 if(n>9)          //1234>9为真进入print(2)函数,123>9为真又进入print(3)函数,12>9为真
                  //又进入print(4)函数,直到1>9为假时不执行print函数,开始打印。
 {                // 1234/10=123;123/10=12;12/10=1;(整数除整数结果为整数)
 print(n/10);       
 }                  //返回开始进行一级一级进行打印 1%10 12%10 123%10 1234%10;
 printf("%d ", n%10);  // 1%10=1;12%10=2;123%10=3;1234%10=4;(%前后须为整数)
}

int main()
{                        
 int num = 1234;
 print(num);   //num实参传递数据给形参n
 return 0; 
}

 

注: 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记忆&碎片

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值