C语言总结_function

function

引子

什么是函数?
在你之前在数学所学,函数表示了变量之间的变换关系。
但是在c语言中,function更应该翻译为功能
函数是完成特定任务的独立程序代码单元

  • 函数是问题的主要解决方式,是实现程序功能的主要载体。
  • 在面向对象中也被称为方法
int main(void)
{
  return 0;
}

这是任何一段C语言程序都必须的main函数

  • C语言程序运行的入口就是main函数。
  • 任何一个C语言程序,有且仅有一个main函数(唯一入口)
  • Arduino 框架下,main被包含进setup()中

函数的组成部分

  • 函数类型
    这个函数返回一个什么类型的变量
    void(无返回值),int,float,int*....
    函数最多只有一个返回值,多变量修改需要使用指针
  • 函数名称
  • 函数参数
    函数传入什么类型的变量

形参可变的函数

使用数目可变的自变量调用

部分参数列表可由省略号表示法(一个逗号后跟三个句点 (, ... ) 终止,以指示可能有多个
自变量传递给函数,但没有有关这些自变量的详细信息。 对此类自变量不执行类型检
查。 省略号表示法前面必须至少有一个参数,并且省略号表示法必须是参数列表中的最
后一个标记。 如果没有省略号表示法,当函数收到除参数列表中声明的参数以外的参数
时,该函数的行为是不确定的。

若要调用具有可变数量的参数的函数,只需在函数调用中指定任意数量的参数即可。 一
个示例是 C 运行库中的 printf 函数。 函数调用必须包含参数列表或参数类型列表中声
明的每个类型名称的一个参数。

除非指定 __fastcall 调用约定,否则函数调用中指定的所有参数都将位于堆栈上。 为函
数声明的形参的数量决定了从堆栈获取和分配给形参的实参的数量。 您负责从堆栈中检
索任何其他参数和确定应存在的参数数量。 STDARG.H 文件包含 ANSI 样式宏,该宏用于
访问采用可变数量的参数的函数的参数。 此外,VARARGS.H 中的 XENIX 样式宏仍受支
持。
以上摘自微软官方c语言文档

自定义函数的声明,定义,调用

代码示例

#include <stdio.h>   //头文件引用
#define PI 3.1415    //宏定义

int global_variables;  //全局变量
int global_a = 0;

int add(int a ,int b);  //函数声明

int main(void)
{
  int local_variables = 1 ; //局部变量
  static int static_L_V;    //局部静态变量
  int* p =(int *)malloc(10 * sizeof(int)); //动态内存管理
  free(p);

  int a=b=1,c;
  c=add(a,b);  //函数调用
  print("&d\n",c);
}

int add(int a ,int b)
{
    //函数定义
  return a+b ;
}

变量的作用域以及生命周期

全局变量 局部变量
静态变量 全局变量就是静态的 函数作用域内static声明
动态变量 涉及动态内存分配

全局变量

  • 存储在内存全局(静态)变量区,程序运行时候分配内存,程序结束内存释放,作用域为整个程序
  • 在所有函数外声明,任何函数可以调用
  • 太多会影响程序的可移植性(参考c++命名空间)
变量类型 作用域 生命周期
全局变量 整个程序 整个程序

局部变量

  • 存储在栈内存,函数调用,内存分配,函数结束,内存释放,作用域为该函数
  • 在函数内部声明,仅供该函数调用。
  • 可以与全局变量重名,重名后对该变量的任何操作是对局部变量的操作
变量类型 作用域 生命周期
局部变量 该函数 该函数

局部静态变量

  • 声明时候使用static关键字,存储再内存全局(静态)变量区
  • 在函数内部声明,仅供该函数调用
  • 函数结束不释放,意味着该值保存供函数下次调用时候使用
变量类型 作用域 生命周期
局部静态变量 该函数 整个程序

函数与指针

函数指针

指向函数的指针变量

int example_function(int,int);
int (*p)(int , int);     //指向对应类型函数的指针
p = example_function;    //为指针确定指向函数
p(1,2);                  //函数的调用

数组指针

int (*p)[n]     //n为指向数组的数组长度

从计组看函数调用

普通函数压栈出栈的过程耗费大量栈空间,模仿宏定义,由此产生内联函数

内联函数

  • 内联行为在编译时候产生,接受编译器类型检查
  • 内联函数定义放在头文件中

静态函数

static修饰

  1. 静态成员函数: 出现在class中
  2. 全局静态函数
    用static修饰的函数,限定在本源码文件中,不能被本源码文件以外的代码文件调用。而普通的函数,默认是extern的,也就是说它可以被其它代码文件调用。
  • 静态函数的使用赋予函数命名空间,解决不同文件之间函数命名问题
  • 保护库函数不被其他文件调用
posted @ 2025-08-13 10:40  loong2525  阅读(71)  评论(0)    收藏  举报