目录
函数是什么?
我们在数学中经常用到函数,在C语言中的函数又是什么呢
函数就是一个子程序,你想使用的时候就可以直接调用。
在计算机科学中,子程序(英语: Subroutine, procedure, function, routine, method,
subprogram, callable unit ),是一个大型程序中的某部分代码, 由一个或多个语句块组
成。它负责完成某项特定任务,而且相较于其他代 码,具备相对的独立性。
C语言中的函数分类:
1.库函数
2.自定义函数
库函数
什么是库函数?
由C 语言的基础库中提供了一系列类似的函数,方便程序员进行软件开发。如:printf函数,scanf函数,strlen函数等等。
注:使用库函数,必须包含 #include 对应的头文件。
在这里我分享一些查询的网站和软件,大家可以去学习:
MSDN(Microsoft Developer Network)
www.cplusplus.com
http://en.cppreference.com (英文版)
http://zh.cppreference.com (中文版)
自定义函数
C语言库里面没有的,我们自己设计的函数就叫自定义函数,一样有函数名,返回值类型和函数参数。
如:
//写一个函数可以找出两个整数中的最大值。
int Max(int a, int b)
{
return a > b ? a : b;
}
再如:
//写一个函数可以交换两个整形变量的内容。
void Swap(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
}
函数的参数
函数的参数可以是:常量、变量、表达式、函数等。
实际参数(实参):
传给函数的参数,叫实参。
无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形
参。
形式参数(形参):
函数接收到的参数,叫形参。
因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
这里我们对函数的实参和形参进行分析:
int fun(int x, int y)
{
int z = x + y;
return z;
}
int main()
{
int a = 10;
int b = 20;
fun(a, b);
return 0;
}
这里可以看到函数在调用的时候, x , y 拥有自己独立的空间。
所以我们可以认为:形参其实相当于实参的一份临时拷贝。
函数的调用
传值调用
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
void Swap(int x, int y)
{
int tmp = x;
x = y;
y = tmp;
}
int main()
{
int a = 10;
int b = 20;
Swap(a, b);
printf("%d %d\n", a, b);
return 0;
}
传址调用
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操
作函数外部的变量。
void Swap(int* x, int* y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
int main()
{
int a = 10;
int b = 20;
Swap(&a, &b);
printf("a = %d,b = %d\n", a, b);
return 0;
}
再拿常见的printf函数和scanf函数,就是典型的传值调用和传址调用。
printf 函数
把数据的值传递给printf函数,然后printf调用窗口按你需要的数据类型打印出来。
scanf函数
把参数的地址传过来,连接输入设备,对变量的值进行修改。如果你不传地址,传值过来, 对形参的修改是不会影响实参。
函数的嵌套调用和链式访问
嵌套调用
#include <stdio.h>
void fun()
{
printf("hehe\n");
}
void test()
{
int i = 0;
for (i = 0; i < 3; i++)
{
fun();
}
}
int main()
{
test();
return 0;
}
函数可以嵌套调用,但是不能嵌套定义。
int main()
{
void test()
{
printf("hello world\n");
}
return 0;
}
//这样是不对的
链式访问
前面说过每个函数都有返回值,能不能把一个函数的返回值作为另外一个函数的参数呢?
#include <stdio.h>
#include <string.h>
int main()
{
printf("%d\n", strlen("abcde"));
return 0;
}
把strlen函数的返回值作为printf的参数,这样写是可以的。