C语言学习之函数

函数的声明

声明:

  1. 当被调函数定义在主调函数的后边,编译器”implicit declration”,可以将该函数在主调函数前边进行声明
  2. 多文件使用函数时,需要对其进行声明,允许被其它文件调用

语法:

返回值 函数名(形参表);

  1. 函数的调用过程

函数在调用的时候存在保护现场和恢复现场的操作:

保护现场:当函数要被调用的时候,会将函数调用位置的下一条指令地址保存在栈空间;

恢复现场:当被调函数执行完时,通过出栈保护现场的地址,决定cpu继续执行的位置在函数被调用的下一条指令位置

函数的传参

1. 函数传参过程,其实是实参向形参拷贝的过程,实参有实参的空间,形参有形参的空间(值传递)。

2. 值传递:在被调函数中,无法修改主调函数中的变量。

3. 函数传参的顺序:自右向左。

函数的递归调用

递归调用:函数直接或间接的调用自己

本质:是一种循环方式

注意:

1. 递归要有递归的出口,否则会成为死循环。

2. 递归调用系统开销比循环大(比如:栈内存)。

函数一维整型数组

传参方式:

定义:返回值 函数名(数组类型 数组名[],int len)

{

//外面数组怎么使用,函数内数组就怎么使用

}

调用:

函数名(数组名,数组长度);

注意:

  1. 数组作为函数参数传递时,形参必须要是数组类型;int a[],[]中的常量可有可无
  2. 2.数组作为函数参数传递时,本质传递的数组首元素地址,所以形参本质是一个地址,是数组的起始地址
  3. 由于数组名传参本质传递的是首地址,所以把必须要传递整形数组的长度
  4. 数组作为函数参数传递给被调函数后,函数内部的使用方法和外面一样,除了sizeof(数组名)