C语言深入了解函数

目录
  • 1. 函数的概念
  • 2. 函数的分类
    • 从定义角度分
    • 从参数角度分类
    • 从返回值角度分
  • 3. 函数的定义
  • 4. 函数的声明
  • 5. 函数的调用
  • 6. 递归函数

1. 函数的概念

函数是c语言的功能单位,实现一个功能可以封装一个函数来实现。

定义函数的时候一切以功能为目的,根据功能去定函数的参数和返回值。 函数就是将特定功能的代码封装在一个函数内部,当使用这些代码时,只需要调用函数即可。

2. 函数的分类

从定义角度分

  • 库函数(即函数是谁实现的)
  • 自定义函数
  • 系统调用(操作系统实现的函数)

从参数角度分类

有参函数:函数有一个或多个形参(参数类型随便)

int fun(int a ,float b,double c){ }

无参函数:函数没有参数,在形参列表的位置写void或什么都不写

int fun(void) { }或 int fun( ){ }

从返回值角度分

带返回值的函数:在定义函数的时候,必须带着返回值类型,在函数体里,必须有return,如果没有返回值类型,默认返回整型。

无返回值函数:函数名前加void,return可以写也可以不写,写的时候后面加一个分号即return;

3. 函数的定义

定义方法:

格式如下

返回值类型 函数名字(形参列表,用逗号分隔开) {

//函数体,函数的功能在函数体里实现

}

int max(int a,int b)
{
 int z;
 if (x>y){
	z = x;
	}
 else{
	z = y;
	}
 return z;
}

注意:函数名字是标识符,所以要满足标识符的命名规则

return 后面跟的变量类型必须与函数名左边的类型一致

在一个程序中,相同的函数名只能出现依次

#include<stdio.h>
// 定义一个没有参数也没有返回值的函数
void myfunc1(){
    printf("哇哦哇哦\n");
    return ;
}
//定义一个无返回值,有参数的函数
void myfunc2(int a,int b){
    int sum;
    sum = a + b;
    printf("%d + %d = %d\n",a,b,sum);
}
//定义一个有返回值,有参数的函数
int myfunc3(int a,int b){
    int sum;
    sum = a + b;
    return sum;
}
int main(){
    // 调用函数myfunc1
    // 调用的时候不用加返回值类型
    myfunc1();
    return 0;
}

4. 函数的声明

概念:对已经定义的函数,进行说明,函数可以多次声明

为什么要进行声明? 有些情况下,如果不对函数进行声明,编译器在编译的时候,可能不认识这个函数,因为编译器在编译c程序的时候,是从上往下编译的。

  • 主调函数和被调函数在同一个.c文件中的时候:

(1)被调函数在上,主调函数在下,不需要声明,即下面的函数可以调用上面的函数

(2)被调函数在下,主调函数在上,需要声明。

对于一些高级的编译器,不用声明也能调用函数,但是会弹出很多warning。

声明的方式

1.直接声明法:将被调用的函数的定义拷贝过去,后面加分号,如下例:

#include<stdio.h>
void myfunc1();  // 直接声明
int main(){
    myfunc1();
    return 0;
}
void myfunc1(){
    printf("哇哦哇哦\n");
    return ;
}

2.间接声明:将函数的声明放在头文件中, .c程序包含头文件即可(例子待补充…)

  • 主调函数和被调函数在不同一个.c文件中的时候:

一定要声明!!!

声明的方式

1.直接声明:将被调用的函数的定义拷贝过去,后面加分号,前面加 extern

2.间接声明:将函数的声明放在头文件中, .c程序包含头文件即可

5. 函数的调用

变量=函数名(实参列表); // 带返回值的

函数名(实参列表); // 不带返回值的

推荐阅读:《形参和实参的区别》

#include<stdio.h>
int sum(int a,int b){    // 定义带返回值的函数,定义的时候是形参
    int sum = a + b;
    return sum;
}
void func(){
    printf("我是无返回值函数!\n");
    printf("我是老六~\n");
    return;
}
int main(){
    int re = sum(1,2);    // 调用带返回值的函数,调用的时候是实参,定义一个int类型的变量re来接收sum函数返回的结果
    printf("结果是:%d\n",re);
    func();   // 调用无返回值函数
    return 0;
}

6. 递归函数

自己调用自己的函数叫做递归函数

递归函数调用会在计算机里同时存在多个,其中最后一个是当前正在工作的那个。

一个非常复杂的问题,如果可以拆分成多个小问题,其中至少有一个小问题和原来的问题本质上一样,只是规模小一些,就可以采用递归来解决。

编写原则

首先要在递归函数中编写语句描述问题的拆分方式

在递归函数的开始编写分支解决不再拆分的情况(这种情况必须保证程序可以结束)

参考《C语言中的递归》

到此这篇关于C语言深入了解函数的文章就介绍到这了,更多相关C语言函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 深入解析C语言中函数指针的定义与使用

    1.函数指针的定义     函数是由执行语句组成的指令序列或者代码,这些代码的有序集合根据其大小被分配到一定的内存空间中,这一片内存空间的起始地址就成为函数的地址,不同的函数有不同的函数地址,编译器通过函数名来索引函数的入口地址,为了方便操作类型属性相同的函数,c/c++引入了函数指针,函数指针就是指向代码入口地址的指针,是指向函数的指针变量. 因而"函数指针"本身首先应该是指针变量,只不过该指针变量指向函数.这正如用指针变量可指向整形变量.字符型.数组一样,这里是指向函数.C在编译时

  • C语言中函数的声明、定义及使用的入门教程

    对函数的"定义"和"声明"不是一回事.函数的定义是指对函数功能的确立,包括指定函数名,函数值类型.形参及其类型以及函数体等,它是一个完整的.独立的函数单位.而函数的声明的作用则是把函数的名字,函数类型以及形参的类型.个数和顺序通知编译系统,以便在调用该函数时进行对照检查(例如,函数名是否正确,实参与形参的类型和个数是否一致),它不包括函数体.--谭浩强 ,<C程序设计>(第四版),清华大学出版社,2010年6月,p182 这段论述包含了许多概念性错误,这

  • C语言函数基础教程分类自定义参数及调用示例详解

    目录 1.  函数是什么? 2.  C语言中函数的分类 2.1 库函数 2.1.1 为什么要有库函数 2.1.2 什么是库函数 2.1.3 主函数只能是main()吗 2.1.4常见的库函数 2.2 自定义函数 2.2.1自定义函数是什么 2.2.2为什么要有自定义函数 2.2.3函数的组成 2.2.4 举例展示 3. 函数的参数 3.1 实际参数(实参) 3.2  形式参数(形参) 4. 函数的调用 4.1 传值调用 4.2  传址调用 4.3 练习 4.3.1. 写一个函数判断一年是不是闰年

  • C语言菜鸟基础教程之自定义函数

    先动手编写程序: #include <stdio.h> int add(int x, int y) { int z = x + y; return z; } int main() { int a = 1; int b = 2; int c = add(a, b); printf("c = %d\n", c); return 0; } 运行结果: c = 3 程序分析: (1) 函数定义的形式为: 类型 函数名称(类型 形式参数,--) { 函数体 } (2) 对应于咱们的程

  • C语言自定义函数的实现

    函数是一段可以重复使用的代码,用来独立地完成某个功能,它可以接收用户传递的数据,也可以不接收.接收用户数据的函数在定义时要指明参数,不接收用户数据的不需要指明,根据这一点可以将函数分为有参函数和无参函数. 将代码段封装成函数的过程叫做函数定义. C语言无参函数的定义 如果函数不接收用户传递的数据,那么定义时可以不带参数.如下所示: dataType functionName(){ //body } dataType 是返回值类型,它可以是C语言中的任意数据类型,例如 int.float.char

  • Swift语言中的函数学习教程

    函数是一个组织在一起语句集合,以执行特定任务.Swift 函数类似于简单 C 函数以及复杂的 Objective C 语言函数. 它使我们能够通过函数调用内部的局部和全局参数值. 像其他任何语言一样 swift 函数也遵循相同的步骤. 函数声明:它告诉编译器有关的函数的名称,返回类型和参数. 函数定义:它提供函数的实际主体. Swift 函数包含参数类型和返回类型. 函数定义 在Swift 语言中函数是由 "func" 关键字来定义.当一个新定义函数时,它可能需要一个或几个值作为函数输

  • Go语言截取字符串函数用法

    本文实例讲述了Go语言截取字符串函数用法.分享给大家供大家参考.具体如下: 复制代码 代码如下: func Substr(str string, start, length int) string {     rs := []rune(str)     rl := len(rs)     end := 0             if start < 0 {         start = rl - 1 + start     }     end = start + length        

  • Go语言中普通函数与方法的区别分析

    本文实例分析了Go语言中普通函数与方法的区别.分享给大家供大家参考.具体分析如下: 1.对于普通函数,接收者为值类型时,不能将指针类型的数据直接传递,反之亦然. 2.对于方法(如struct的方法),接收者为值类型时,可以直接用指针类型的变量调用方法,反过来同样也可以. 以下为简单示例: 复制代码 代码如下: package structTest    //普通函数与方法的区别(在接收者分别为值类型和指针类型的时候)  //Date:2014-4-3 10:00:07    import ( 

  • 用C语言模仿Python函数的实例

    首先得说明一点,C 语言不是函数式编程语言,要想进行完全的函数式编程,还得先写个虚拟机,然后再写个解释器才行(相当于 CPython ). 下面我们提供一个例子,说明 C 语言函数可以"适度地模仿" Python 函数. 我们有如下的 Python 程序: def line_conf(a, b): def line(x): return a*x + b return line line1 = line_conf(1, 1) line2 = line_conf(4, 5) print(l

  • 详解C语言中的函数、数组与指针

    1.函数:当程序很小的时候,我们可以使用一个main函数就能搞定,但当程序变大的时候,就超出了人的大脑承受范围,逻辑不清了,这时候就需要把一个大程序分成许多小的模块来组织,于是就出现了函数概念:   函数是C语言代码的基本组成部分,它是一个小的模块,整个程序由很多个功能独立的模块(函数)组成.这就是程序设计的基本分化方法: (1) 写一个函数的关键: 函数定义:函数的定义是这个函数的实现,函数定义中包含了函数体,函数体中的代码段决定了这个函数的功能: 函数声明:函数声明也称函数原型声明,函数的原

  • C语言编程中函数的基本学习教程

    C 语言中的函数等价于 Fortran 语言中的子程序或函数,也等价于 Pascal 语言中的过程或函数.函数为计算的封装提供了一种简便的方法,此后使用函数时不需要考虑它是如何实现的.使用设计正确的函数,程序员无需考虑功能是如何实现的,而只需知道它具有哪些功能就够了.在 C 语言中可以简单.方便.高效地使用函数.我们经常会看到在定义后仅调用了一次的短函数,这样做可以使代码段更清晰易读. 到目前为止,我们所使用的函数(如 printf.getchar 和 putchar 等)都是函数库中提供的函数

  • 用C语言模仿Python函数的一种简单实现方法

    首先得说明一点,C 语言不是函数式编程语言,要想进行完全的函数式编程,还得先写个虚拟机,然后再写个解释器才行(相当于 CPython ). 下面我们提供一个例子,说明 C 语言函数可以"适度地模仿" Python 函数. 我们有如下的 Python 程序: def line_conf(a, b): def line(x): return a*x + b return line line1 = line_conf(1, 1) line2 = line_conf(4, 5) print(l

  • 详解C语言用malloc函数申请二维动态数组的实例

    详解C语言用malloc函数申请二维动态数组的实例 C语言在程序运行中动态的申请及释放内存十分方便,一维数组的申请及释放比较简单. Sample one #include <stdio.h> int main() { char * p=(char *)malloc(sizeof(char)*5);//申请包含5个字符型的数组 free(p); return 0; } 是否申请二维动态内存也如此简单呢?答案是否定的.申请二维数组有一下几种方法 Sample two /* 申请一个5行3列的字符型

  • 学习不同 Java.net 语言中类似的函数结构

    前言 函数式编程语言包含多个系列的常见函数.但开发人员有时很难在语言之间进行切换,因为熟悉的函数具有不熟悉的名称.函数式语言倾向于基于函数范例来命名这些常见函数.从脚本背景衍生而来的语言倾向于使用更具描述性的名称(有时是多个名称,包含多个指向同一个函数的别名). 在本期文章中,我将继续探讨 3 种重要函数(过滤.映射和缩减)的实用性,展示来自每种 Java 下一代语言的实现细节.文中的讨论和示例旨在减轻 3 种语言对类似函数结构使用的不一致名称时可能引起的混淆. 过滤 在过滤 函数中,您可指定一

  • c++语言中虚函数实现多态的原理详解

    前言 自上一个帖子之间跳过了一篇总结性的帖子,之后再发,今天主要研究了c++语言当中虚函数对多态的实现,感叹于c++设计者的精妙绝伦 c++中虚函数表的作用主要是实现了多态的机制.首先先解释一下多态的概念,多态是c++的特点之一,关于多态,简而言之就是 用父类的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数,这种方法呢,可以让父类的指针具有多种形态,也就是说不需要改动很多的代码就可以让父类这一种指针,干一些很多子类指针的事情,这里是从虚函数的实现机制层面进行研究 在写这篇帖子之前

随机推荐