之前数学中我们接触过函数的概念,现在我们来了解下C语言中的函数。
目录
函数组成
库函数
自定义函数
函数调用
嵌套调用和链式访问
声明和定义
递归
函数组成
函数相当于一个工厂,将给进的原材料(函数实参)加工成想要的产品。
下面是一个函数组成模板:
ret_type fun_name(paral)
{
statement;//语句项,实现函数功能
}
库函数
C语言提供一些提供常用功能的函数,使用时只需包含对应头文件便可直接调用,常用库函数有●IO函数 ●字符串操作函数 ●内存操作函数 ●时间/日期操作函数 ●数学操作函数 ●其他库函数这些库函数可以在MSDN,www.cplusplus.com,hhtp://en.cppreference.com(英文版),hhtp://zh.cppreference.com(中文版)上查询学习。
下面是库函数memsert的调用
#include//包含printf函数的头文件
#include//包含memset函数的头文件
int main() {
char arr[20] = "hello world";
memset(arr, 'x', 5);//arr,'x',5为函数实参
printf("%s", arr);
return 0;
}
自定义函数
自定义函数是由程序员自己创建某种功能的函数,自定义函数的创建最好具有高内聚低耦合的特点。
下面是一个实现求两个整数和的值的自定义函数
#include
int ADD(int a, int b)//函数返回值类型为int;a,b为函数形参
{
return a + b;//返回a+b(int型)的值
}
int main() {
int a = 10, b = 1, c = 0;
c = ADD(a, b);//a,b为函数实参;c接收函数的返回值
printf("%d", c);
return 0;
}
函数调用
C语言函数调用有两种方式,分别是传值调用和传值调用
●传值调用
传递数值,函数形参和实参分别占有不同的内存块,对形参的修改不会影响实参。
如:
#include
void Swap1(int x, int y) {
int tmp = 0;
tmp = x;
x = y;
y = tmp; }
int main(){
int a=1,b=0;
Swap1(a,b) ;
printf("a=%dnb=%d",a,b);
return 0;
}
运行结果如下:
此函数并不能交换a,b的值
●传址调用
是把函数外部创建变量的内存地址传递该函数参数的一种调用函数的方式,在函数内部可直接操作函数外部的变量。
如:
#include
void Swap1(int* x, int* y) {
int tmp = 0;
tmp = *x;
*x = *y;
*y = tmp;
}
int main() {
int a = 1, b = 0;
Swap1(&a, &b);
printf("a=%dnb=%d", a, b);
return 0;
}
运行结果如下:
函数可以交换a,b的值
嵌套调用和链式访问
●嵌套调用
函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。
如:
#include
void new_line()
{
printf("hehen");
}
void three_line()
{
int i = 0;
for(i=0; i<3; i++)
{
new_line();//在three_line函数里调用new_line函数
}
}
int main()
{
three_line();//调用three_line函数
return 0; }
*注:函数可以嵌套调用,但是不能嵌套定义。
●链式访问
把一个函数的返回值作为另外一个函数的参数。
如:
#include
int main()
{
printf("%d", printf("%d", printf("%d", 43)));
}
声明和定义
●声明
1.
告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。
2.
函数的声明一般出现在函数的使用之前。要满足
先声明后使用
。
3.
函数的声明一般要放在头文件中的
●定义
函数的定义是指函数的具体实现,交待函数的功能实现。
int Add(int,int);//函数声明
int Add(int x, int y) //函数定义
{
return x+y;
}
递归
程序调用自身的编程技巧称为递归。
递归需存在限制条件,当满足这个限制条件的时候,递归便不再继续且每次递归调用之后越来越接近这个限制条件。
下面是一段递归代码:
int fib(int n) {
if (n <= 2)
return 1;
else
return fib(n - 1) + fib(n - 2);//函数递归
}
*注:递归效率较低,但当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开。
销。
函数相当于一个工厂,将给进的原材料(函数实参)加工成想要的产品。
下面是一个函数组成模板:
ret_type fun_name(paral)
{
statement;//语句项,实现函数功能
}
C语言提供一些提供常用功能的函数,使用时只需包含对应头文件便可直接调用,常用库函数有●IO函数 ●字符串操作函数 ●内存操作函数 ●时间/日期操作函数 ●数学操作函数 ●其他库函数这些库函数可以在MSDN,www.cplusplus.com,hhtp://en.cppreference.com(英文版),hhtp://zh.cppreference.com(中文版)上查询学习。
下面是库函数memsert的调用
#include//包含printf函数的头文件 #include //包含memset函数的头文件 int main() { char arr[20] = "hello world"; memset(arr, 'x', 5);//arr,'x',5为函数实参 printf("%s", arr); return 0; }
自定义函数
自定义函数是由程序员自己创建某种功能的函数,自定义函数的创建最好具有高内聚低耦合的特点。
下面是一个实现求两个整数和的值的自定义函数
#include
int ADD(int a, int b)//函数返回值类型为int;a,b为函数形参
{
return a + b;//返回a+b(int型)的值
}
int main() {
int a = 10, b = 1, c = 0;
c = ADD(a, b);//a,b为函数实参;c接收函数的返回值
printf("%d", c);
return 0;
}
函数调用
C语言函数调用有两种方式,分别是传值调用和传值调用
●传值调用
传递数值,函数形参和实参分别占有不同的内存块,对形参的修改不会影响实参。
如:
#include
void Swap1(int x, int y) {
int tmp = 0;
tmp = x;
x = y;
y = tmp; }
int main(){
int a=1,b=0;
Swap1(a,b) ;
printf("a=%dnb=%d",a,b);
return 0;
}
运行结果如下:
此函数并不能交换a,b的值
●传址调用
是把函数外部创建变量的内存地址传递该函数参数的一种调用函数的方式,在函数内部可直接操作函数外部的变量。
如:
#include
void Swap1(int* x, int* y) {
int tmp = 0;
tmp = *x;
*x = *y;
*y = tmp;
}
int main() {
int a = 1, b = 0;
Swap1(&a, &b);
printf("a=%dnb=%d", a, b);
return 0;
}
运行结果如下:
函数可以交换a,b的值
嵌套调用和链式访问
●嵌套调用
函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。
如:
#include
void new_line()
{
printf("hehen");
}
void three_line()
{
int i = 0;
for(i=0; i<3; i++)
{
new_line();//在three_line函数里调用new_line函数
}
}
int main()
{
three_line();//调用three_line函数
return 0; }
*注:函数可以嵌套调用,但是不能嵌套定义。
●链式访问
把一个函数的返回值作为另外一个函数的参数。
如:
#include
int main()
{
printf("%d", printf("%d", printf("%d", 43)));
}
声明和定义
●声明
1.
告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。
2.
函数的声明一般出现在函数的使用之前。要满足
先声明后使用
。
3.
函数的声明一般要放在头文件中的
●定义
函数的定义是指函数的具体实现,交待函数的功能实现。
int Add(int,int);//函数声明
int Add(int x, int y) //函数定义
{
return x+y;
}
递归
程序调用自身的编程技巧称为递归。
递归需存在限制条件,当满足这个限制条件的时候,递归便不再继续且每次递归调用之后越来越接近这个限制条件。
下面是一段递归代码:
int fib(int n) {
if (n <= 2)
return 1;
else
return fib(n - 1) + fib(n - 2);//函数递归
}
*注:递归效率较低,但当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开。
销。
自定义函数是由程序员自己创建某种功能的函数,自定义函数的创建最好具有高内聚低耦合的特点。
下面是一个实现求两个整数和的值的自定义函数
#includeint ADD(int a, int b)//函数返回值类型为int;a,b为函数形参 { return a + b;//返回a+b(int型)的值 } int main() { int a = 10, b = 1, c = 0; c = ADD(a, b);//a,b为函数实参;c接收函数的返回值 printf("%d", c); return 0; }
C语言函数调用有两种方式,分别是传值调用和传值调用
●传值调用
传递数值,函数形参和实参分别占有不同的内存块,对形参的修改不会影响实参。
如:
#includevoid Swap1(int x, int y) { int tmp = 0; tmp = x; x = y; y = tmp; } int main(){ int a=1,b=0; Swap1(a,b) ; printf("a=%dnb=%d",a,b); return 0; } 运行结果如下:
此函数并不能交换a,b的值
●传址调用
是把函数外部创建变量的内存地址传递该函数参数的一种调用函数的方式,在函数内部可直接操作函数外部的变量。
如:
#includevoid Swap1(int* x, int* y) { int tmp = 0; tmp = *x; *x = *y; *y = tmp; } int main() { int a = 1, b = 0; Swap1(&a, &b); printf("a=%dnb=%d", a, b); return 0; } 运行结果如下:
函数可以交换a,b的值
嵌套调用和链式访问
●嵌套调用
函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。
如:
#include
void new_line()
{
printf("hehen");
}
void three_line()
{
int i = 0;
for(i=0; i<3; i++)
{
new_line();//在three_line函数里调用new_line函数
}
}
int main()
{
three_line();//调用three_line函数
return 0; }
*注:函数可以嵌套调用,但是不能嵌套定义。
●链式访问
把一个函数的返回值作为另外一个函数的参数。
如:
#include
int main()
{
printf("%d", printf("%d", printf("%d", 43)));
}
声明和定义
●声明
1.
告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。
2.
函数的声明一般出现在函数的使用之前。要满足
先声明后使用
。
3.
函数的声明一般要放在头文件中的
●定义
函数的定义是指函数的具体实现,交待函数的功能实现。
int Add(int,int);//函数声明
int Add(int x, int y) //函数定义
{
return x+y;
}
递归
程序调用自身的编程技巧称为递归。
递归需存在限制条件,当满足这个限制条件的时候,递归便不再继续且每次递归调用之后越来越接近这个限制条件。
下面是一段递归代码:
int fib(int n) {
if (n <= 2)
return 1;
else
return fib(n - 1) + fib(n - 2);//函数递归
}
*注:递归效率较低,但当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开。
销。
●嵌套调用
函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。
如:
#includevoid new_line() { printf("hehen"); } void three_line() { int i = 0; for(i=0; i<3; i++) { new_line();//在three_line函数里调用new_line函数 } } int main() { three_line();//调用three_line函数 return 0; }
*注:函数可以嵌套调用,但是不能嵌套定义。
●链式访问
把一个函数的返回值作为另外一个函数的参数。
如:
#includeint main() { printf("%d", printf("%d", printf("%d", 43))); }
●声明
1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。 2. 函数的声明一般出现在函数的使用之前。要满足 先声明后使用 。 3. 函数的声明一般要放在头文件中的●定义
函数的定义是指函数的具体实现,交待函数的功能实现。
int Add(int,int);//函数声明 int Add(int x, int y) //函数定义 { return x+y; }
递归
程序调用自身的编程技巧称为递归。
递归需存在限制条件,当满足这个限制条件的时候,递归便不再继续且每次递归调用之后越来越接近这个限制条件。
下面是一段递归代码:
int fib(int n) {
if (n <= 2)
return 1;
else
return fib(n - 1) + fib(n - 2);//函数递归
}
*注:递归效率较低,但当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开。
销。
int fib(int n) {
if (n <= 2)
return 1;
else
return fib(n - 1) + fib(n - 2);//函数递归
}
*注:递归效率较低,但当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开。
销。好啦,有关C语言函数的介绍就介绍到此啦,希望大家能有所收获哈 ~



