- 今天学习了函数的,了解了函数分为库函数以及自定义函数,库函数可以直接调用函数库里自带的函数进行使用如strcpy(交换数值)char * strcpy ( char * destination, const char * source ); ,memset(将某一内容设定为指定值)void * memset ( void * ptr, int value, size_t num );
※库函数的使用必须包含 #include 对应的头文件
如果使用自定义函数不带返回值,那么必须加上void如 void Swap2(int *px, int *py) ;
- 函数的参数分为实际参数和形式参数
#include<stdio.h>
void swap(int *num1,int *num2)
{
int tem=0;
tem=*num1;
*num1=*num2;
*num2=tem;
}
int main()
{
int x;
int y;
swap(&x,&y);
printf("%d %d",x,y);
return 0;
}
交换时要取&,这样才能找到x,y的地址,交换xy的内容时要加上‘ * ’
即当用参数改变实参时必须用&取地址如add(&a) void add(int *p)
- 函数的调用分为
传值调用:函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
传址调用:传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操 作函数外部的变量。- 函数的嵌套调用和链式访问,即函数和函数之间可以有机的组合的。
- 函数的声明和定义
//test.h中的内容
#ifndef __TEST_H__
#define __TEST_H__
//函数的声明
int Add(int x, int y);
#endif //__TEST_H__
函数的定义:是指函数的具体实现,交待函数的功能实现。如下
//tset.c中的内容
#include "test.h"
//函数Add的实现
int Add(int x, int y) {
return x+y; }
- 递归函数:它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求 解。 递归的主要思考方式在于:把大事化小 。
例题1 接受一个整型值(无符号),按照顺序打印它的每一位。 例如:输入:1234,输出 1 2 3 4.
#include<stdio.h>
void print(int n)
{
if(n>9)
{
print(n/10);
}
printf("%d ",n%10);
}
int main()
{
unsigned int num=0;
scanf("%d",&num);
print(num);
return 0;
}
例题2 编写函数不允许创建临时变量,求字符串的长度。
#include<stdio.h>
int my_strlen(char* str)
{
if(*str!=0)
{
return 1+my_strlen(str+1);
}
else
return 0;
}
int main()
{
char arr[]="bit";
//int len=strlen(arr);
//printf("%d\n",len);
int len = my_strlen(arr);
printf("len=%d\n",len);
return 0;
}
例题3 求n的阶乘。
#include<stdio.h>
int fac2(int n)
{
if(n<=1)
return 1;
else
return n*fac2(n-1);
}
int main()
{
int n=0;
int ret=0;
scanf("%d",&n);
ret = fac2(n);
printf("%d\n",ret);
return 0;
}
例题4 求第n个斐波那契数。
#include<stdio.h>
int fib(int n)
{
if(n<=2)
return 1;
else
return fib(n-1)+fib(n-2);
}
int main()
{
int n=0;
int ret=0;
scanf("%d",&n);
ret= fib(n);
printf("ret=%d\n",ret);
return 0;
}
此方法求斐波那契数并不是一个好方法,因为其中会重复好多遍同一计算,而系统分配给程序的栈空间是有限的,所以会导致栈溢出。
※printf函数的返回值是打印在屏幕上字符的个数