C语言函数(2)

前言

在写正式内容之前,先对上一篇博客(http://t.csdn.cn/JRw3H)补充一些知识点:

函数的声明和定义

函数的声明

函数声明文字定义如下:
1.告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。
2.函数的声明一般出现在函数的使用之前。要满足先声明后使用。
代码样例在上一篇博客以举出,因此不在赘述。

函数的定义:

函数的定义是指函数的具体实现,交待函数的功能实现。
在这里插入图片描述
上图为函数定义的图文展示。

函数的参数

函数的参数有两种,形式参数和实际参数。

形式参数(形参)

其定义如下:
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
在这里插入图片描述
形式参数只在函数范围内有效,函数调用完之后自动销毁,所以任意函数的形参名字可以相同,也可以和主函数的变量名相同。代码样例如下:

#include <stdio.h>
int add(int x, int y)
{
	int result = x + y;
	return result;
}
int main()
{
	int x, y;
	scanf("%d%d", &x, &y);
	int c = add(x, y);
	printf("%d", c);
	return 0;
}

如上代码,主函数的变量是x和y,函数的形参也可以是x,y,程序并不会报错。

实际参数

其定义如下:
真实传给函数的参数,叫实参。
实参可以是:常量、变量、表达式、函数等。
无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
在这里插入图片描述
如上图,其中的add(a,b)也可以变成add(3,4)、add(1+2,1+3)或add(add(1,2),add(1,3))。这些替换程序都不会报错。

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

函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。

嵌套调用

这里直接以代码举例:

#include <stdio.h>
void new_line()
{
    printf("hehe\n");
}
void three_1ine()
{
    int i = 0;
    for (i = 0; i < 3; i++) 
    {
        new_line();
    }
}
int main()
{
    three_1ine();
    return 0;
}

如上图在three_1ine()函数中调用了new_line()函数,这就是函数的嵌套调用。以下为执行示例。
在这里插入图片描述
另外要注意,函数可以嵌套调用,但是不能嵌套定义。

链式访问

其定义为:
把一个函数的返回值作为另外一个函数的参数。以下为代码样例:

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[20] = "he11o";
	int ret = strlen(strcat(arr, "bit"));//函数的链式访问
	printf("%d\n",ret);
	return 0;
}

如果读者不知道以上程序的strlen函数和strcat函数的用途一定要去搜索一下(库函数有很多,一些不常用和没见过的库函数一定要发挥搜索引擎的力量,不能因为不常用和没见过就忽略)。strcat函数返回的字符串会作为strlen函数的参数,这就是函数的链式访问。执行结果:
在这里插入图片描述
示例2:

#include <stdio.h>
int main()
{
printf("%d",printf("%d",printf("%d",43)));
return 0;
}

这里拓展一下,在以上代码示例中printf函数返回值为数字个数,如printf(“%d”,43),它会先打印43,然后返回2,然后前一个printf会打印数字2然后返回1,最后的printf会打印数字1,然后返回1.
执行结果如下:
在这里插入图片描述

函数递归

什么是递归呢?
1.程序调用自身的编程技巧称为递归。
2.递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的
用通俗的语言来说,函数递归就是一个函数调用它自己。
使用递归的两个必要条件:
1.存在限制条件,当满足这个限制条件的时候,递归便不再继续。
2.每次递归调用之后越来越接近这个限制条件。
如果使用递归不满足这两个条件,那么就会编程死递归,程序会一直运行下去,最后被强制终止。
我们先来看一个例子

#include <stdio.h>
int main()
{
	printf("hehe\n");
	main();
	return 0;
}

以上就是一个死递归main()函数在一直使用自己,但没有终止条件。
然后我们来看一下递归的原理:

#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;
}

在这里插入图片描述

以上代码就是一个简单的递归。我们用图文来解释一下递归:
在这里插入图片描述

最后拓展

非void函数,如果不写返回值,函数会默认返回一个值。
有些编译器上返回的是:最有一条指令产生的结果。
代码如下:

#include <stdio.h>
int test()
{
	int a = 10;
	int b = 20;
	int c = a + b;
}
int main()
{
	printf("%d\n", test());
	return 0;
}

在这里插入图片描述
最后制作不易,如果您觉得不错还请点个一键三连,欢迎在评论区或私信笔者指出错误。

  • 34
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 32
    评论
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值