C语言 函数

本文详细解释了C语言中函数的分类,包括按实现者、参数、返回值和存储类别划分,以及函数声明的重要性,同时介绍了变量的存储区域和作用范围,区分了外部函数和内部函数的概念。
摘要由CSDN通过智能技术生成

函数

函数的分类

  1. 从定义的角度分类(即函数是谁实现的)

    1. 库函数(C库实现的)

    2. 自定义函数(程序员自己实现的函数)

    3. 系统调用(操作系统实现的函数)

    4. 从参数角度分类

    5. 有参数

      • 函数的形参,可以是一个,或者多个,参数的类型随便完全取决于函数的功能

      • int fun(int a,float b,double c)
        {}
        
    6. 无参数

      • 函数没有参数,在形参列表的位置写个void或者不写

      • int fun(void){}
        int fun(){}
        
  2. 从返回值角度分类

    1. 带返回值的函数

      • 在定义函数的时候,必须带着返回值类型,在函数体里,必须有return

      • 如果没有返回值类型,默认返回整数

      • char fun() // 定义了一个返回字符类型的函数
        {
        	char b = 'a';
        	return b;
        }
        fun()  // 没有给返回类型,默认是整型
        {
            return 1;
        }
        
      • 注意: 在定义函数的时候,函数的返回值类型,到底是什么类型,取决于函数的功能.

    2. 没有返回值的函数

      • 在定义的时候,函数名字前面加 void

        void fun(参数)
        {}
        
      • return ; return 一个空格,或者不写return.

函数的定义

什么叫做函数的定义呢? 及函数的实现

  1. 函数的定义方法

    返回值类型 函数名(形参列表)
    {
    // 函数体,函数的功能在函数体里实现
    }
    
    列如:
    int max(int x,int y)
    {
    	int z;
    	z = x > y ? x : y;
    	return z;
    }
    

    注:形参必修带类型,而且以逗号分隔

    注:函数不能重名,就是不能重复定义。

    函数的定义不能嵌套,即不能在一个函数体内定义另一个函数,所有函数都是平行的。

函数的声明

  1. 概念

    • 对已经定义的函数,进行说明
    • 函数的声明可以声明多次
  2. 为什么要声明

    • 有些情况下,如果不对函数进行声明,编译器在编译的时候,可能不认识这个函数,因为编译器在编译C程序的时候,从上往下编译的。
  3. 声明的方法

    • 什么时候需要声明

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

      • 被调用函数在上,主调函数在下

      • 这种情况下,不用声明 列

        int max(int a,int b)
        {}
        int main()
        {
        	max(1,2);
        }
        
    • 直接声明

      #include<stdio.h>
      void fun(); //直接声明 
      extern int max(int x,int y);   // 外部的.c文件中的函数,通过 extern 直接声明
      int main()
      {
      	fun();
      	return 0;
      }
      void fun()
      {
      	printf("Hello");
      }
      
    • 间接声明(两个文件)

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

    • // 文件1
      #include<stdio.h>  // 库文件是尖括号,尖括号是不会在原文件目录里找的.
      #include"文件二.h"  //自己写的,在一个路径里用"
      int main()
      {
      	fun();
      	return 0;
      }
      void fun()
      {
      	printf("Hello");
      }
      
    • // 文件二.h  注意,需要将文件二放到头文件里
      extern void fun(void);
      // extern 代表外部的意思
      

变量的存储类别

  1. 内存:物理内存、虚拟内存

    • 物理内存:实实在在存在的存储设备
    • 虚拟内存:操作系统虚拟出来的内存
    • 操作系统会在物理内存和虚拟内存之间做映射。
    • 在写应用程序的时候,咱看到的都是虚拟地址
  2. 在运行程序的时候,操作系统会将 虚拟内存进行分区。

    分别是一下五种:

    1. :在动态申请内存的时候,在堆里开辟内存

    2. :主要存放局部变量。

    3. 静态全局区

      • 未初始化的静态全局区

        静态变量(定义变量的时候,前面加 static 修饰)或全局变量,没有初始化的,存在此区

      • 初始化的静态全局区

        全局变量、静态变量、赋过初值的,存放在此区。

    4. 代码区:存放咱们的程序代码。

    5. 文字常量区:存放常量的。

普通的全局变量

概念:

  • 在函数外部定义的变量

  • int num = 100; //num 就是一个全局变量
    int main()
    {
    	return 0;
    }
    

作用范围:

  • 普通全局变量的作用范围,是程序的所有地方.
  • 只不过用之前需要声明. 声明方法 extern int num;
  • 注意声明的时候,不要赋值.

生命周期:

  • 程序运行的整个过程,一致存在,直到程序结束.

注意:定义普通的全局变量的时候,如果不赋初值,它的值默认为 0

静态的全局变量

  • 概念:定义局部变量的时候,前面加 static 修饰
  • 作用范围: 在它定义的函数或复合语句中有效。
  • 生命周期:
    • 第一次调用函数的时候,开辟空间赋值,函数结束后,不释放,以后再调用函数的时候,就不再为其开辟空间,也不再赋初值,用的是以前的那个变量。
#include<stdio.h>

void fun(void)
{
	static int num = 3;
	num++;
	printf("num = %d\n", num);
}
int main()
{
	fun();
	fun();
	fun();
	return 0;
} 

注意:

  • 定义**普通局部**变量,如果不赋初值,它的值是随机的。
  • 定义**静态局部变量,如果不赋初值,它的值是0**。
  • 普通**全局变量,和静态全局变量如果不赋初值,它的值为0**.
变量存储类别扩展
  • 在同一作用范围内,不允许变量重名。
  • 作用范围不同的可以重名。
  • 局部范围内,重名的全局变量不起作用。(就近原则)

外部函数

  • 咱们定义的普通函数,都是外部函数
  • 即函数可以在程序的任何一个文件中调用

内部函数

  • 在定义函数的时候,返回值类型前面加 static 修饰.这样的函数被称为内部函数
  • static 限定了函数的作用范围,在**定义的 .c 中有效**。

内部函数,和外部函数的区别:

  • 外部函数,在所有地方都可以使用
  • 内部函数, 只能在所定义的.c中的函数调用.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值