"函数"在英文的翻译是"function",无论在自然科学还是计算机科学都是这个词,而"function"的本意是"功能",可能是在汉语的习惯中,"这是一个函数"比"这是一个功能"听起来更专业,更正常一点,所以才使用了这个翻译。但是,如果把"function"或者"函数"理解为"功能"将为对这个词的理解提供很大帮助。 So,何为“功能”? “功能”其实就是"来料加工,需要的话再输出",这里面有三个部分,一个是"来料",一个是"加工",一个是"输出",比如,肝脏的功能就是将"来"的有毒物质进行"加工"成无毒的物质再"输出"。热水器的功能就是将"来"的冷水"加工"成热水。

C语言函数驱动的语言,所有的功能都被封装在一个个函数中,也就是一个个"功能"中。比如,main()函数是所有C语言程序的入口函数,所有的C的功能必须直接或间接通过main()来调用。再比如,ANSI C的标准事先封装好了很多常用的函数,你可以直接拿来用。但就像公司会给你配一台电脑用来工作,而你一定要台屏幕30寸还能随身携带的笔记本,那很无奈,你得自己造一个。在实际编程中,不幸的是这种自己造笔记本的情况再普通不过,幸运的是,造这样一台满足你需要的笔记本再简单不过。

C语言的函数分为四种:main函数标准库函数STL系统调用SCI,和自定义函数。这里说的就是自定义函数。

定义

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

在这个定义中,形参列表即函数的"输入",函数体即函数的"加工过程",返回值类型即函数的"输出",函数名即这个函数的标识符。

形式参数

"形式参数",即"不存在的参数",它只是让你在写函数体的时候一个标识符来表示你要处理的对象,编译器不会给形式参数的分配内存,形式参数可以没有,此时最好写void关键字。

无论是传入参数"值"还是传入"地址",调用函数的时候都会把相应的参数在被调用函数的栈中复制一份,只是"值"并不能唯一的标识内存中的变量,但"地址"可以,所以只要"地址"指向的内容还没有被释放,就可以通过"地址"在正确的读取相应的变量。所以以"地址"的形式传入参数可以将参数从函数内部带出来,因为"地址"是内存唯一的(参见 返回地址)。

函数体

我们的所有的"加工"过程都在这里,如果函数需要返回值,需要return关键字

函数名

即函数的标识符,本质是函数的指针

返回值

函数处理结束后需要传出的数据,可以没有,此时需要写void关键字,

  1. //举个栗子,实现对传入的两个参数的作和,
  2. int sum(int xint y){
  3. return x+y;
  4. }

返回地址

返回一个变量的地址有5种方法,但绝没有返回栈区局部变量的指针,因为栈区局部变量在函数执行完毕后就随着函数栈一起被销毁了,指针指向的内容是不确定的

  1. 返回全局变量的指针
  1. int x;
  2. int* fcn(){
  3. return &x;
  4. }
  1. 使用静态变量的指针
  1. int* fcn(){
  2. static int x=5;
  3. return &x;
  4. }
  1. 返回传入参数的指针
  1. int* fcn(int x){
  2. return &x;
  3. }
  1. 不返回任何指针,将目标当作参数传入
  1. void fcn(int arg, int* result){
  2. result = &arg;
  3. }
  1. 返回指向堆区的指针
  1. int* fcn(){
  2. int* ptr=(int*)malloc(sizeof(int));
  3. return ptr;
  4. }

声明

如果一个函数在调用前没有定义,那么需要专门的声明语句

  1. 返回值类型 函数名(形参类型列表);

调用

  1. 函数名(实参列表);

函数的调用就是"使用"一个函数,就是把我们要处理的数据传入到函数中

  1. //栗子
  2. int x=1,y=2,z=0;
  3. z=sum(x,y);

函数指针

即指向函数的指针,

定义

  1. 返回值类型 (*函数名)(形参类型列表);

程序很简单的时候,不写形参类型列表也会编译通过,但这是错误的,一旦程序略大,就会出错。

  1. //定义一个函数指针并初始化
  2. int add(int a, int b){
  3. return a+b;
  4. }
  5. int (*pAdd)(int, int)=add;
  1. //定义一个函数指针数组,并初始化
  2. int add(int a, int b){
  3. return a+b;
  4. }
  5. int sub(int a,int b){
  6. return a-b;
  7. }
  8. int (*pAS[2])(int, int)={add,sub};
  9. //pAS[0]=add;
  10. //pAS[1]=sub;

回调函数

即利用函数指针将一个函数当作参数进行调用

  1. //定义一个回调函数
  2. int calc(int (*fcn)(int ,int ), int a, int b){
  3. return fcn(a,b)
  4. }
  5. //调用一个回调函数
  6. calc(padd,12,342);
  7. calc(psub,12,123);

C语言的函数的更多相关文章

  1. C语言pow函数编写

    C语言pow函数编写 #include<stdio.h> double chaoba(double f,double q); //声明自定义函数 void main(void) { dou ...

  2. C语言-自定义函数

    C语言自定义函数 --1-- 自定义函数定义 1.1 无参无返回值函数 1.2 无参有返回值函数 1.3 有参无返回值函数 1.4 有参有返回值函数 --2-- 函数的参数 2.1 形式参数介绍和使用 ...

  3. C语言printf()函数:格式化输出函数

    C语言printf()函数:格式化输出函数 头文件:#include <stdio.h> printf()函数是最常用的格式化输出函数,其原型为:     int printf( char ...

  4. c语言main函数返回值、参数详解(返回值是必须的,0表示正常退出)

    C语言Main函数返回值 main函数的返回值,用于说明程序的退出状态.如果返回0,则代表程序正常退出:返回其它数字的含义则由系统决定.通常,返回非零代表程序异常退出. 很多人甚至市面上的一些书籍,都 ...

  5. Go语言示例-函数返回多个值

    Go语言中函数可以返回多个值,这和其它编程语言有很大的不同.对于有其它语言编程经验的人来说,最大的障碍不是学习这个特性,而是很难想到去使用这个特性. 简单如交换两个数值的例子: package mai ...

  6. 【学习笔记】【C语言】函数

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

  7. 【转载】 c语言inline函数的使用

    c语言inline函数的使用 转载自:http://blog.chinaunix.net/uid-21843265-id-3056446.html 大学在教科书上学习过inline函数,定义为inli ...

  8. 【C语言】函数和自定义函数

    函数,我之前也提到过一点点内容.其实函数是很好理解的,但是写起来又十分麻烦. 一.     函数引入 我们知道,C源程序是由函数组成的.请看下面的简单函数例子 #include <stdio.h ...

  9. c语言中函数的简单介绍

    c语言中函数的介绍: 函数,简单的说就是代码的打包.存放在一个地方,当需要的时候调用. 函数分类: 1.无参无返回值函数 void func() 2.无参有返回值函数  int func() 3.有参 ...

随机推荐

  1. [Tool] Fiddle2基本使用

    Fiddler2已经成网页调试必备的工具. 简述下快捷命令: ?url =statu.=method @host bpafter url bpv method start stop 参考的文章: Fi ...

  2. Gradle学习系列之八——构建多个Project

    在本系列的上篇文章中,我们讲到了Gradle的依赖管理,在本篇文章中,我们将讲到如何构建多个Project. 请通过以下方式下载本系列文章的Github示例代码: git clone https:// ...

  3. 数论 - 简单数位推理 --- NYIST 514

    Problem's Link:http://acm.nyist.net/JudgeOnline/problem.php?pid=514 Mean: 给你一个l和r,求出在这个范围内的1的个数. ana ...

  4. JavaMail入门第三篇 发送邮件

    JavaMail API中定义了一个java.mail.Transport类,它专门用于执行邮件发送任务,这个类的实例对象封装了某种邮件发送协议的底层实施细节,应用程序调用这个类中的方法就可以把Mes ...

  5. WEB前端开发和调试的工具

    前端开发在线课程: http://yun.lu/student/course/list/8   1.HBuilder:WEB开发IDE工具 hbulider,内核是eclipse,Dcloud公司出品 ...

  6. java微信开发框架wechat4j入门教程

    wechat4j What is wechat4j? wechat develop framework for java(微信开发框架JAVA版,最简单易用微信开发框架) wechat4j可以用来干什 ...

  7. 【JavaEE】Hibernate继承映射,不用多态查询只查父表的方法

    几个月前,我在博问里面发了一个问题:http://q.cnblogs.com/q/64900/,但是一直没有找到好的答案,关闭问题以后才自己解决了,在这里分享一下. 首先我重复一下场景,博问里面举的动 ...

  8. APP落地页开发中的一些小经验~

    在开发日常落地页的时候,每当碰到一些很酷炫的宣传图用css实现很复杂且耗时的时候,一般采取切图然后将其放在页面中,在这个过程中发现<img/>标签中图片下方会有一行小空白,影响了与后一部分 ...

  9. Vue中class与style绑定

    gitHub地址:https://github.com/lily1010/vue_learn/tree/master/lesson07 一 用对象的方法绑定class 很简单,举个栗子: <!D ...

  10. JS-取出字符串中重复次数最多的字符并输出

    /** 取出字符串中重复字数最多的字符 */ var words = 'sdfghjkfastgbyhnvdstyaujskgfdfhlaa'; //创建字符串 var word, //单个字符 le ...