函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。
定义函数
return_type function_name( parameter list )
{
body of the function
}
- 返回类型:返回值的类型,没有返回值时return_type时关键词void
- 函数名称
- 参数
- 函数主体
实例:
/* 函数返回两个数中较大的那个数 */
int max(int num1, int num2)
{
/* 局部变量声明 */
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
函数声明
return_type function_name(parameter_list);
int max(int num1, int num2);
// 函数声明中,参数名称可省去
int max(int, int);
调用函数
当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。
#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;
}
output:
Max value is : 200
函数参数
形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。
1、传值调用
该方法吧参数的实际值复制给函数形参,修改函数内部形参不影响实际参数。
#include <stdio.h>
void swap(int, int);
int main()
{
int x=2, y=3;
printf("交换前 x=%d\n", x);
printf("交换前 y=%d\n", y);
/* 调用函数来交换值 */
swap(x, y);
printf("交换后 x=%d\n", x);
printf("交换后 y=%d\n", y);
return 0;
}
void swap(int x, int y)
{
int temp;
temp = x;
x = y;
y = temp;
return;
}
output:
交换前 x=2
交换前 y=3
交换后 x=2
交换后 y=3
可以看到,主函数中的a和b实际上没有交换
2、引用调用
通过引用传递方式,形参为指向实参地址的指针,当对形参的指针操作时,就相当于对实参本身操作。
#include <stdio.h>
void swap(int*, int*);
int main()
{
int x=2, y=3;
printf("交换前 x=%d\n", x);
printf("交换前 y=%d\n", y);
swap(&x, &y);
printf("交换后 x=%d\n", x);
printf("交换后 y=%d\n", y);
return 0;
}
void swap(int *x, int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
return;
}
output:
交换前 x=2
交换前 y=3
交换后 x=3
交换后 y=2
交换成功 !
变量作用域
作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问
1、局部变量
在某个函数或块的内部声明的变量称为局部变量。
#include <stdio.h>
int main ()
{
/* 局部变量声明 */
int a, b;
int c;
/* 实际初始化 */
a = 10;
b = 20;
c = a + b;
printf ("value of a = %d, b = %d and c = %d\n", a, b, c);
return 0;
}
2、全局变量
全局变量定义在函数外部,通常是在程序的顶部。全局变量在整个程序生命周期内都是有效的,在任意的函数内部能访问全局变量。
#include <stdio.h>
/* 全局变量声明 */
int g;
int main ()
{
/* 局部变量声明 */
int a, b;
/* 实际初始化 */
a = 10;
b = 20;
g = a + b;
printf ("value of a = %d, b = %d and g = %d\n", a, b, g);
return 0;
}
局部变量和全局变量的名称可以相同,但是在函数内,局部变量的值会覆盖全局变量的值。
3、形式参数
函数的参数,被当作该函数内的局部变量,它们会优先覆盖全局变量。