`
ydbc
  • 浏览: 766845 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

【C语言】10-函数

 
阅读更多

一、基本概念

1.什么是函数

任何一个C语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”。所以,你可以说C语言程序是由函数构成的。

比如你用C语言编写了一个MP3播放器程序,那么它的程序结构如下图所示:

  • 从上图可以看出:函数就是用来实现某个功能的程序段,每一个函数都有自己的功能。因此,你应该把实现某个功能所需的代码都写在函数中。比如,有个函数的功能是播放MP3,那么播放MP3的代码都应该写到这个函数中。
  • 当调用(执行)一个函数时,计算机就会按顺序执行函数中的所有代码,从而展示函数所实现的功能。

2.函数名

一般来说,我们会将不同的功能交给不同的函数去实现。比如,将暂停播放MP3的代码写到一个函数中,将停止播放MP3的代码写到另一个函数中。因此,一个C程序中可能会有很多的函数。为了方便调用和区分这些函数,我们需要为每一个函数都起一个唯一的名称,函数的命名必须按照标示符命名规则。利用函数名就可以调用到对应的函数。

二、函数的定义

1.任何一个函数在使用之前都必须进行定义

定义函数的目的就是为了写清楚你这个函数是干啥用的,里面包含了哪些代码。函数的定义格式如下:

1 返回值类型  函数名(形式参数列表)
2 {
3     函数体
4 }

2.举例

比如定义一个函数用来计算两个整数的和。那么可以写成下面这样:

复制代码
 1 #include <stdio.h>
 2 
 3 int sum(int a, int b)
 4 {
 5     int c = a + b;
 6     return c;
 7 }
 8 
 9 int main()
10 {
11     int d = sum(10, 11);
12     
13     printf("d is %d", d);
14     return 0;
15 }
复制代码
  • 分别在第3行、第9行定义了sum函数、main函数,其中sum函数的作用是计算两个整数的和。
  • 函数定义好后,并不会马上执行函数内部的代码,要有人调用它才会执行内部的代码。就好像你的手机虽然有打电话的功能,但是只有按了拨号键,才会执行打电话的功能。
  • 程序运行时就会先调用main函数,按顺序执行第11~14行代码,因为main函数是程序的入口
  • 第11行的sum(10, 11)是调用sum函数,sum函数被调用了,就会分配存储空间给形式参数列表中的所有参数,也就是第3行中的变量a和变量b,它们都是“形式参数”
  • 第11行中的10、11称为“实际参数”,它们将分别赋值给变量a、变量b,也就是相当于
1 int a = 10;
2 int b = 11;
  • 既然调用了sum函数,就会按顺序执行sum函数中的代码,也就是第5~6行代码。
  • 第5行将a+b的值21赋值给了变量c,第6行使用return关键字将变量c返回给了函数调用者,也是说,第11行sum(10, 11)的值是21。那么变量d的值就是21。
  • 第13行的输出结果为:
d is 21
  • 第3~7行中的变量a、b、c都只有在调用sum函数时,才会分配存储空间,当sum函数执行完毕后,变量a、b、c就会被释放存储空间。因此,它们的作用域仅限于sum函数内部。
  • 第3行sum左边的int称为“返回值类型”,第6行return关键字后面跟着的数值称为“返回值”,因此第6行的变量c就是返回值,返回值的数据类型应该跟“返回值类型”保持一致。

三、形式参数和实际参数

1.基本概念

1> 形式参数:定义函数时,函数名后面的小括号()中定义的变量称为形式参数,简称形参

2> 实际参数:在调用函数时传入的值称为实际参数,简称实参

2.调用函数时传递的实参个数 必须和 函数的形参个数必须保持一致

复制代码
 1 int sum(int a, int b, int c)
 2 {
 3     return a + b + c;
 4 }
 5 
 6 int main()
 7 {
 8     sum(10, 9, 7);
 9     return 0;
10 }
复制代码

第1行中sum函数中有3个形参,因此在第8行调用sum函数时,需要传入3个实参

3.当使用基本数据类型(char、int、float等)作为实参时,实参和形参之间只是值传递,修改形参的值并不影响到实参

复制代码
 1 #include <stdio.h>
 2 
 3 int test(char a)
 4 {
 5     a = 10;
 6     
 7     return 0;
 8 }
 9 
10 int main()
11 {
12     char b = 5;
13     
14     test(b);
15     
16     printf("b的值是%d", b);
17     
18     return 0;
19 }
复制代码
  • 在第3行定义了test函数,只有一个形参a
  • 在第14行调用了test函数,接着就会分配内存给变量a。这里将变量b当做实参,那么变量b的值将传递给变量a。这个时候,内存中大致如下图所示:

(其实在内存中存储的是二进制数据,这里我写成10进制是为了直观性)

  • 执行完第5行代码后,变量a的值变成了10,但是变量b的值依然是5

  • 第16行代码的输出结果是:
b的值是5

因此,在函数内部修改了形参的值,并不会影响到外面的实参。

4.函数可以没有形参

定义一个函数时是可以没有形参的,比如下面的函数

复制代码
 1 #include <stdio.h>
 2 
 3 int test()
 4 {
 5     printf("调用了test函数");
 6     return 0;
 7 }
 8 
 9 int main()
10 {
11     test();
12     return 0;
13 }
复制代码
  • 在第3行定义了test函数,可以发现,它的形参列表是空的,也就是没有形参
  • 那么在第11行调用test函数时,就不用传递任何实参
  • 其实,第9行定义的main函数也是没有形参的

四、返回值类型

1.返回值就是函数调用完后,返回给函数调用者的结果,用return关键字进行返回。定义函数时,要指明函数的返回值类型

复制代码
 1 double pi()
 2 {
 3     return 3.4;
 4 }
 5 
 6 int main()
 7 {
 8     double a = pi();
 9     return 0;
10 }
复制代码
  • 第1行定义了一个pi函数,返回值类型是double,因此用return返回的数值应该是double类型的,这里返回的是3.14
  • 第8行pi函数调用完毕后,函数调用者得到的值就是3.14,因此,变量a的值是3.14

2.一个函数可以没有返回值,如果没有返回值,应该用void表示返回值类型

复制代码
 1 #include <stdio.h>
 2 
 3 void test()
 4 {
 5     printf("调用了test函数");
 6     return;
 7 }
 8 
 9 int main()
10 {
11     test();
12     return 0;
13 }
复制代码
  • 在第3行定义了一个test函数,它是没有返回值的,所以第6行的return后面没有跟上任何数值
  • 在第11行调用了test函数

3.如果一个函数没有返回值,最后面的return语句可以省略

所以,上面的test函数可以简化成:

1 void test()
2 {
3     printf("调用了test函数");
4 }

4.如果一个函数没有明确写出返回值类型,那么代表这个函数的返回值类型是int

1 sum(int a, int b)
2 {
3     return a + b;
4 }

可以看到,第1行定义的sum函数没有明确写出返回值类型,那么这个sum函数的返回值类型就是int。因此,第3行return后面跟随的是int类型数据

五、return

1.return语句可以在函数内部返回一个值给函数调用者

复制代码
 1 int sum(int a, int b)
 2 {
 3     return a + b;
 4 }
 5 
 6 int main()
 7 {
 8     int c = sum(5, 8);
 9     return 0;
10 }
复制代码

第3行使用了return语句,将a+b的值返回给了函数调用者,因此第8行变量c的值是13

2.一个函数内部可以多次使用return语句,使用了return语句后,函数就会马上停止执行,return语句后面的代码就不再被执行

复制代码
1 int max(int a, int b)
2 {
3     if (a>b)
4     {
5         return a;
6     }
7     
8     return b;
9 }
复制代码
  • 这个max函数可以用来求出两个整数中的最大值
  • 如果a大于b,就执行第5行代码,直接将a返回,函数就会停止执行。也就是说,后面的第8行代码就不会被执行
  • 如果a不大于b,就执行第8行代码,将b返回

六、函数定义的注意

1.函数名不能重复

默认情况下,函数的名字必须唯一。下面的写法是错误的:

复制代码
1 void test(int a)
2 {
3 
4 }
5 
6 int test()
7 {
8     return 10;
9 }
复制代码

第1、6行定义的函数的名称都是test,编译器会直接报错

2.每一个函数都应该独立定义,不能嵌套定义

下面的写法是错误的:

复制代码
1 int main()
2 {
3     void test()
4     {
5     
6     }
7     
8     return 0;
9 }
复制代码

在第3行把test函数定义在了main函数内部,这是错误的写法

七、常见函数

1.main函数

第一个C语言程序开始,就认识了这个main函数。main函数是整个C程序的入口,有了main函数,C程序才能运行成功,而且整个C程序中只能有一个main函数。

main函数的简单定义如下:

1 int main()
2 {
3     
4     return 0;
5 }

它可以没有形式参数,返回值是int类型。它的返回值用于说明程序的退出状态:如果返回0,则代表程序正常退出,否则代表程序异常退出

2.printf函数

你可能已经注意到,平时一直在使用的printf其实也是一个函数,这是系统自带的函数

复制代码
1 #include <stdio.h>
2 
3 int main()
4 {
5     
6     printf("我要学习iOS开发");
7     
8     return 0;
9 }
复制代码
  • 在第6行调用了printf函数,传入的参数是一个字符串常量:"我要学习iOS开发"
  • printf函数的作用是在屏幕上输出内容
  • 注意第1行代码,如果你使用了printf函数,就要加上这一句,至于原因,会在后面的章节详细介绍
分享到:
评论

相关推荐

    C语言函数-子函数-主函数与子函数的调用

    C语言函数-子函数-主函数与子函数的调用; C语言初学者

    C语言--程序设计导论 C语言--程序设计导论

    - 定义与调用:函数是C语言的基本模块,可以实现特定功能并复用代码。 - 参数与返回值:函数可以接受参数,处理后返回结果。 - 主函数main():程序的入口点,C语言的执行始于main()。 4. **指针** - 指针变量:...

    嵌入式C语言培训-C编程基础-递归函数视频教程

    本教程“嵌入式C语言培训-C编程基础-递归函数视频教程”聚焦于C语言的一个关键特性——递归函数。递归是编程中的一个强大工具,能够简化复杂问题的解决方案,但它也需要程序员有深入的理解才能正确使用。 递归函数...

    C语言课件--函数那一章

    C语言课件,函数那一章,总结的相当不错哦,我们老师整合的网上的资源编写的

    C语言学习-字符串处理函数

    C语言学习-字符串处理函数 strcat(char str1,char str2) strcpy(char str1,char str2) strncpy(char str1,char str2,int n) strcmp(char str1,char str2)//比较两个字符串大小str1&gt;str2返回值&gt;0,str1=str2...

    C语言编程-编写一个函数,该函数可以统计一个长度为2的字符串在另一个字符串中出现的次数;

    C语言编程-编写一个函数,该函数可以统计一个长度为2的字符串在另一个字符串中出现的次数;

    c语言实例---自己筛选的

    这些实例可能是从各种来源收集的,旨在提供一个全面的学习资源,涵盖了C语言的不同方面,包括基本语法、数据类型、控制结构、函数、指针、内存管理等。 【标签】:“C语言” “C语言”标签明确了这个压缩包的内容...

    谢丽聪老师C语言课件-1C语言概述-2009.ppt

    C语言的输入输出函数包括scanf函数、printf函数、gets函数、puts函数等。 C语言的控制语句包括if语句、switch语句、while语句、for语句、do-while语句等。 C语言的数据类型包括整型、浮点型、字符型、数组型、结构...

    C语言--程序设计导论

    此外,还可能讨论函数指针,它是C语言的一个强大特性,可以用来实现回调函数和高阶函数。 第六章可能涵盖数组和字符串,这是C语言中重要的数据结构。数组是存储相同类型元素的集合,而字符串是特殊的字符数组。这一...

    C语言中级-9再论函数

    10. 函数重载: 虽然C语言本身不支持函数重载,但可以通过不同的参数列表或类型别名来模拟类似效果。 11. 内联函数: 内联函数是C++引入的概念,但在C99标准中,C语言也提供了`inline`关键字,用于请求编译器尝试...

    C语言资料大全----函数库,MFC.etc

    "C语言资料大全----函数库,MFC.etc"这个压缩包包含了学习C语言过程中可能会用到的重要资源,特别是关于函数库和MFC(Microsoft Foundation Classes)的相关内容。 函数库是预编译的代码集合,为开发者提供了方便的...

    边学边用C语言--超级经典教程

    4. **指针**:深入解析C语言中的指针概念,包括指针的声明、赋值、解引用,以及指针与数组、函数的关系。 5. **内存管理**:涉及动态内存分配(malloc、calloc、realloc、free)和栈与堆的概念。 6. **预处理器**...

    C语言库函数---unix常用系统调用

    C语言库函数---unix常用系统调用........

    C语言开发----c语言矿井逃生.rar

    10. **游戏逻辑实现**:具体到矿井逃生游戏,我们需要设计游戏规则,比如玩家如何移动、如何避开障碍、如何判定胜利条件等,这些都需要用C语言编写相应的函数来实现。 通过这个项目,学习者不仅可以巩固C语言的基本...

    最经典的C语言教程--精通C语言必备

    - 字符数组与字符串:学习C语言中的字符串表示,掌握字符串常量、字符数组和字符串处理函数,如strcpy、strcat、strcmp等。 4. **指针** - 指针基础:理解指针的声明、初始化和解引用,以及指针作为变量、函数...

    C语言开发----c语言学生信息系统.rar

    C语言的核心包括变量定义、数据类型(如int、char、float等)、运算符、控制结构(如if语句、switch语句、for循环、while循环)以及函数的使用。在开发学生信息系统时,我们可能会定义结构体(struct)来存储学生的...

    C语言开发----c语言扔香蕉的大猩猩.rar

    10. **标准库**:C语言的标准库提供了大量的函数,如数学运算的math.h,时间操作的time.h,字符串处理的string.h等。 学习C语言的过程就像训练大猩猩扔香蕉,一开始可能不太熟练,但随着练习的增加,你会逐渐掌握其...

    c语言课件--我自己的

    ### C语言程序设计基础知识点概览 #### 一、课程目标 本课程旨在帮助学生掌握C语言的基础知识和编程技能,具体目标包括: 1. **理解C语言的基本语法规则和数据类型**:掌握C语言的基本语法结构,如变量定义、数据...

    CRC16-CCITT C语言实现函数

    CRC16校验:校验采用CRC16,多项式为X16+X12+X5+1,初始字节全部设置为0xFF,对控制代码、数据长度和数据部分做校验;

Global site tag (gtag.js) - Google Analytics