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修饰
- 静态成员函数: 出现在class中
- 全局静态函数
用static修饰的函数,限定在本源码文件中,不能被本源码文件以外的代码文件调用。而普通的函数,默认是extern的,也就是说它可以被其它代码文件调用。
- 静态函数的使用赋予函数命名空间,解决不同文件之间函数命名问题
- 保护库函数不被其他文件调用

浙公网安备 33010602011771号