c语言中函数+图片详解

函数要学什么?

1.函数有什么用

2.函数库

3.自定义函数

4.函数的参数

5.函数的调用

6.函数的嵌套调用和链式访问

7.函数的声明和定义

8.函数的递归

函数有什么用?

1.在c语言当中的main就是一个函数,现在我们写的代码比较简单完全可以放到main函数当中,但是在实际的开发中代码肯能不会这么少,如果全部写的main函数当中main函数会变得非常庞大,代码看起来会很复杂导致你想优化一段代码的时候找起来会很费时间。

2.这就用到库函数和自定义函数了,我们想实现哪一部分功能分到不同的自定义函数当中而main函数只负责业务逻辑和程序流程,需要执行任务的时候直接调用自定义函数就行。

库函数

什么是库函数?

输入函数scanf。打印函数printf。拷贝一些字符串strcpy。计算n的次方pow。这些都是c语言提供的函数。

为什么存在库函数?

如果c语言没有提供这些库函数你们可以想象一下如果你想在屏幕上打印一些东西出来或者输入一些信息进去这些函数本身是没有的要自己实现,如果每个程序员都需要自己实现这些功能,这样开发效率比较低,因为大家都在重复的做一件事情。所以我们在开发的过程中每个程序员都可能用的到为了支持可移植性和提高程序的效率,所以c语言提供了库函数。

怎么学习库函数呢?

c语言常用的库函数有:lo函数,字符串操作函数,字符操作函数,内存操作函数,时间/日期函数,数学函数,其他库函数。

这是一个库函数的学习网站:www.cplusplus.com

 

 

 自定义函数

自定义函数和库函数一样,有函数名,返回值类型和函数参数。但是不一样的是这些都是自己来设计的这给程序员一个很大的发挥空间。

void lol(y, * )  

{

statement;//语句项  函数体

}


void 返回类型
lol 函数名
y  函数参数


函数的组成

下面来举个例子就明白函数怎么使用的了。

#include <stdio.h>


int lol(int x, int y)
{
return (x>y)?(x):(y);
}

int main()
{
int num1 = 10;
int num2 = 20;
int max = lol(num1, num2);
printf("max = %dn", max);
return 0;
}

比较大小

函数的参数

1.实际参数:

真实传来函数的参数,叫实参。

实参可以是:常量,变量,表达式,函数。

2.形参:

形式参数是指函数名后括号中的变量。形试参数当函数调用完成之后就自动销毁了。所以形式参数只在函数中有效。

 

 以上可以看到lol函数在调用的时候,x,y拥有自己的空间,同时拥有了和实参一模一样的内容。所以我们可以简单的认为:形参相当于实参的一份临时拷贝。所以对形参的修改不会改变实参。

用函数的方式交换俩个值,如果你不使用指针交换的话就很好的体现出形参的修改不会改变实参。

#include <stdio.h>
错误版本
void lol1(int x, int y)
{
int tmp = 0;
tmp = x;
x = y;
y = tmp;
}


//正确的版本
void lol2(int *p, int *y)
{
int tmp = 0;
tmp = *p;
*p = *y;
*y = tmp;
}


int main()
{
int num1 = 1;
int num2 = 2;
lol1(num1, num2);
printf("Swap1::num1 = %d num2 = %dn", num1, num2);
lol2(&num1, &num2);
printf("Swap2::num1 = %d num2 = %dn", num1, num2);
return 0;
}

函数的调用

传值调用:

函数的形参和实参都有各自的内存,形参的修改不会改变实参

传址调用:

这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。

函数的嵌套调用和链式访问

在函数当中函数的嵌套调用是很常见的尤其是在写几百行代码的时候。

但是函数只能嵌套调用不能嵌套定义。

#include <stdio.h>

void lpl()
{
printf("hehen");
}


void lol()
{
  int i = 0;
for(i=0; i<10; i++)
 {
    lpl();
 }
}


int main()
{
lol();
return 0;
}




链式访问:是把一个函数的返回值作为另一个函数的参数

 上面便是对链式访问的很好解释。

函数的声明和定义

在写函数的时候如果把函数写到后面就会出现函数未定义的情况,以前书上有这样的写法,这需要把函数定义到main函数的前面,让main函数知道有这个函数。我们把函数写到main函数的前面就可以解决这个问题。

是不是觉得函数的声明没什么作用?其实函数的声明和定义是非常常用的。

比如说你写了一个软件,想卖给张三的公司然后还想卖给李四的公司,他不可以把原代码卖给他们,如果看到源代码的话今天你买了明天你就不买了,你就把那个软件的实现写到一个函数当中把它的头文件在定义一下。这样你把头文件卖给他们。

函数的递归

1.什么是递归

程序调用自身的编程技巧称为递归,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归就是把大事化小。执行递归函数将反复调用其自身每调用一次就进入新的一层。

2.递归的条件:有限制条件,满足这个限制条件递归不再继续。递归必须要用结束条件。

//接受一个整型值(无符号),按照顺序打印它的每一位。
#include <stdio.h>
void print(int n)
{
	if (n > 9)
	{
		print(n / 10);
	}
	printf("%d ", n % 10);
}
int main()
{
	int num = 0;
	scanf("%d", &num);
	print(num);
	return 0;
}

 上面是一个简单的递归,也是我对递归的理解。

每次函数调用都会在内存的栈区申请一块空间,上面print函数调用print函数的时候又申请了一块空间然后print函数又调用然后又申请,可以想象一下如果没有if语句就会这样无限循环下去会出现栈溢出的现象。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>