* ==定义函数==-
```c
return_type function_name( parameter list )
{
body of the function
}
```
- **返回类型**:一个函数可以返回一个值。return_type 是函数返回的值的数据类型。
-有些函数执行所需的操作而不返回值,在这种情况下用Void
- **函数名称**:这是函数的实际名称。函数名和参数列表一起构成了函数签名。
- **参数**:参数就像是占位符。当函数被调用时,你向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。
函数可能不包含参数
==以上构成函数的头==
- **函数主体**:函数主体包含一组定义函数执行任务的语句。
* 函数声明
函数声明告诉编译器:我要使用这个函数啦,给我记住
```c
return_type function_name( parameter list );
```
函数声明就是函数的头,在声明中参数的名称并不重要,参数的类型最重要。——所以可以只定义参数的类型
```c
int max(int, int);
```
* *当你在一个源文件中定义函数且在另一个文件中调用函数时,函数声明是必需的。在这种情况下,你应该在调用函数的文件顶部声明函数。*
*
* 调用函数
当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。
调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。
```c
#include <stdio.h>
/* 函数声明 */
int max(int num1, int num2);
int main ()
{
/* 局部变量定义 */
int a = 100;
int b = 200;
int ret;
/* 调用函数来获取最大值 */
ret = max(a, b);
printf( "Max value is : %d\n", ret );
return 0;
}
/* 函数返回两个数中较大的那个数 */
int max(int num1, int num2)
{
/* 局部变量声明 */
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
```
* 函数参数的调用
函数参数的调用有两种方法:
* ==传值调用==
传值调用是将所需要调用的参数值 “复制”到函数中运行。
所以函数中对参数进行变更的操作并不会对==本体==产生影响
例子
```c
/* 函数定义 */
void swap(int x, int y)
{
int temp;
temp = x; /* 保存 x 的值 */
x = y; /* 把 y 赋值给 x */
y = temp; /* 把 temp 赋值给 y */
return;
}
```
```c
#include <stdio.h>
/* 函数声明 */
void swap(int x, int y);
int main ()
{
/* 局部变量定义 */
int a = 100;
int b = 200;
printf("交换前,a 的值: %d\n", a );
printf("交换前,b 的值: %d\n", b );
/* 调用函数来交换值 */
swap(a, b);
printf("交换后,a 的值: %d\n", a );
printf("交换后,b 的值: %d\n", b );
return 0;
}
```
从例子中可以看出这种用函数交换两个变量的值的方法并不能真正改变变量的值
* ==引用调用==
向函数传递参数的引用调用方法,把参数的地址复制给形式参数
按引用传递值,参数指针被传递给函数,就像传递其他值给函数一样。因此相应地,在函数声明中,需要声明函数参数为指针类型。
例子
```c
/* 函数定义 */
void swap(int *x, int *y)
{
int temp;
temp = *x; /* 保存地址 x 的值 */
*x = *y; /* 把 y 赋值给 x */
*y = temp; /* 把 temp 赋值给 y */
return;
}
```
```c
#include <stdio.h>
/* 函数声明 */
void swap(int *x, int *y);
int main ()
{
/* 局部变量定义 */
int a = 100;
int b = 200;
printf("交换前,a 的值: %d\n", a );
printf("交换前,b 的值: %d\n", b );
/* 调用函数来交换值
* &a 表示指向 a 的指针,即变量 a 的地址
* &b 表示指向 b 的指针,即变量 b 的地址
*/
swap(&a, &b);
printf("交换后,a 的值: %d\n", a );
printf("交换后,b 的值: %d\n", b );
return 0;
}
```
当上面的代码被编译和执行时,它会产生下列结果:
```c
交换前,a 的值: 100
交换前,b 的值: 200
交换后,a 的值: 200
交换后,b 的值: 100
```
所以当使用“引用调用”的时候就可以在函数中对参量的值进行更改