C语言函数

函数
1.1 函数的原型和调用
在使用函数前必须定义或者声明函数
double circle(double r);
int main()
{
double length = circle(10);
printf(“length = %f\n”, length);
return 0;
}

double circle(double r)
{
return 2 * 3.14 * r;
}

1.2 函数的形参与实参
在调用函数的时候,函数大多数都有参数,主调函数和被调用函数之间需要传递数据。
在定义函数时函数名后面括弧中的变量名称为“形式参数”,简称形参。在调用函数时,函数名后面括号中的变量或表达式称为“实际参数”,简称实参。
1形参在未出现函数调用时,他们并不占用内存单元,只有在发生函数调用的时候形参才被分配内存,函数调用完成后,形参所占的内存被释放
2实参可以是变量,常量或者表达式
3在定义函数时,一定要指定形参的数据类型
4形参与实参的数据类型一定要可兼容
5在C语言中,实参与形参的数据传递是“值传递”,即单向传递,只由实参传递给形参,而不能由形参传递给实参。
如果函数的参数是个数组,那么是可以通过形参修改实参的值的
1.3 函数的返回类型与返回值
1函数的返回值通过函数中的return获得,如果函数的返回值为void可以不需要return语句。
2函数return语句中的返回值数据类型应该与函数定义时相同。
3如果函数中没有return语句,那么函数将返回一个不确定的值。
1.4 main函数与exit函数与函数的return语句
int test1()
{
printf(“111111\n”);
//return 0;
exit(0);//在子函数中调用exit同样代表程序终止,但在子函数中调用return只是子函数终止,程序正常执行
printf(“222222\n”);
}

int main()
{
test1();
printf(“AAAAAA\n”);
exit(100);//exit是C语言的库函数,调用exit的结果就是程序终止
return 100;//在main函数中调用exit与调用return是一样的
printf(“CCCCCCC\n”);

return 0;//main函数return代表程序终止
printf(“BBBBBB\n”);
}

1.5 多个源代码文件程序的编译
1.5.1 头文件的使用
如果把main函数放在第一个文件中,而把自定义函数放在第二个文件中,那么就需要在第一个文件中声明函数原型。
如果把函数原型包含在一个头文件里,那么就不必每次使用函数的时候都声明其原型了。把函数声明放入头文件是很好的习惯。
1.5.2 #include与#define的意义
#include就是简单的文件内容替换
#define就是简单的文本替换而已
1.5.3 #ifndef与#endif
#ifndef的意思就是条件预编译,如果#ifndef 后面的条件成立,那么就预编译从#ifndef开始到#endif之间的代码,否则不会去预编译这段代码

1.6 函数的递归
函数可以调用自己,这就叫函数的递归
void recurse(int i)
{
if (i > 0)
{
recurse(i - 1);
}
printf(“i = %d\n”, i);
}

int main()
{
recurse(10);
return 0;
}

1.6.1 递归的过程分析
void up_down(int n)
{
printf(“in %d, location %p\n”, n, &n);
if (n < 4)
up_down((n + 1));
printf(“out %d, location %p\n”, n, &n);
}

int main()
{
up_down(1);
return 0;
}
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
有n个人排成一队,问第n个人多少岁,他回答比前面一个人大2岁,再问前面一个人多少岁,他回答比前面一个人大2岁,一直问到最后问第一个人,他回答10岁
int age(int n)
{
int i;
if (n == 1)
i = 10;
else
i = age(n - 1) + 2;
return i;
}

将10进制数转化为二进制数的例子
234在十进制下为2 * 10的2次方 + 3 * 10的1次方 + 4*10的0次方。
奇数的二进制最后一位一定是1,偶数的二进制最后一位一定是0。
可以通过 number % 2 得到二进制形式的最后一位,如果要将一个完整的整数转化为二进制就需要用到递归函数。
在递归调用之前,计算 number % 2的值,然后在递归调用语句之后进行输出,这样计算出的第一个数值反而在最后一个输出。
为了得出下一个数,需要把原数除以2,这种计算相当于十进制下把小数点左移一位,如果此时得出的数是偶数,,则下一个二进制的数值是0,如果得出的是奇数,那么下一个二进制数为1。
直到被2除的结果小于2,就停止递归。
void to_binary(unsigned int n)
{
unsigned int i = n % 2;
if (n >= 2)
to_binary(n / 2);
printf("%c", i + 0x30);
}

斐波那契数列例子
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …
第0项是0,第1项是第一个1。
这个数列从第2项开始,每一项都等于前两项之和。
int fib(int n)
{

if (n == 0)
return 0;
if (n == 1)
return 1;
if (n > 1)
return fib(n - 1) + fib(n - 2);
}

1.6.2 递归的优点
递归给某些编程问题提供了最简单的方法
1.6.3 递归的缺点
一个有缺陷的递归会很快耗尽计算机的资源,递归的程序难以理解和维护。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值