轻松掌握C语言中的函数

目录

一、什么是函数?

二、C语言中函数的分类

       1、库函数

       2、自定义函数

三、函数的参数

       1、实际参数(实参)

       2、形式参数(形参

四、函数的调用

       1、传值调用

       2、传址调用

五、嵌套调用和链式访问

       1、嵌套调用

       2、链式访问

六、函数的声明和定义

       1、函数声明

       2、函数定义

七、函数的递归和迭代

       1、函数的递归

       2、函数的迭代

八、函数的练习

 

 一、什么是函数?

        相信大家对数学中的函数应该都不陌生吧!但是这个函数与C语言中的函数是不一样的。维基百科中这样定义:函数是指一段可以直接被另一段程序或代码引用的程序或代码。函数部分代码负责完成某项特定任务,与其他代码没有太大的联系。C语言中的函数是由函数返回值类型、函数名和函数参数三部分组成的。

二、C语言中函数的分类

      1、库函数

      为什么会有库函数呢?刚开始,有很多常用的函数经常会被用到,像printf,scanf等等。C语言库函数就是标准自定义函数的集合库,每个库函数都会有自己相对应的头文件。常见的C语言库函数大体可分为七类:1.IO函数 2.字符串操作函数 3.字符操作函数 4.内存操作函数 5.时间/日期函数 6.数学函数 7.其他库函数等等,这么多函数我知道大家一下子肯定记不住,在这里我给大家分享一个可以快速查询函数的工具:https://legacy.cplusplus.com/reference/

       2、自定义函数

       自定义函数顾名思义就是自己定义的函数,这类函数可以完成我们自己想要执行的东西。

       自定义函数和库函数一样,有函数名,返回值类型和函数参数。

       自定义函数的组成如下:

ret_type fun_name(para1,...)
{
     //语句项;
}

ret_type:是函数的返回类型

fun_name:是函数名

para1 :是函数参数,这里面可以有多个参数。

       值得注意的是:传过来的num1,num2都是 int类型,形参设计的时候也是int。函数返回类型是你定义函数时自己决定的,默认为int型。类型名就决定了返回类型,如果没有明确写出返回类型的话,默认为int类型。void是空类型, void必须要明确写出来才可以,指的是函数不提供返回值,不是默认的。

三、函数的参数

       1、实际参数

       真实传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。

       2、形式参数

       形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。

        从上述可以看出实参和形参的地址是不一样的。形式参数只有在函数被调用的时候才实例化,当调用完之后,形式参数就被销毁了,因此形式参数只在调用的函数才有效。我们可以理解为形参实例化之后其实相当于实参的一份临时拷贝。

四、函数的调用

        1、传值调用

        传值调用指直接将实参的值传递给形参,此时实参与形参之间无关系,相互独立,对形参的改变不会对实参造成影响。

        从上述的图片可以看出,在传值过程中,实参的值直接传给了形参,没有发生了改变,它们之间是相互独立的。

        2、传址调用

        传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。

        我们发现,传址调用传过去的实参是地址,这时候接收的形参就需要指针了,指针pa,pb管理的就是我们a,b的地址。我们解引用(*)的时候,就可以顺着这个地址,获得到a,b的值,并对它们进行操作(*pa--->a,*pb--->b)。

        在上述图片右边的监视中可以观察到在swap()函数中,对*pa,*pb进行交换后,这时候主函数里面的a和b的值也发生了交换。

五、嵌套调用和链式访问

        1、嵌套调用

        嵌套调用即在一个函数里可以调用另一个函数,而不能嵌套定义。下面举一个简单的例子:

void print2()
{
    printf("哈喽!\n");
}
void print1()
{
    print2();
}
int main()
{
    print1();
    return 0;
}

       主函数中调用了print1()函数,然后接着在print1()函数中又调用了print2()函数。这就是一个嵌套调用。

        2、链式访问

        把一个函数的返回值作为另外一个函数的参数。下面举一个简单的例子:

int main()
{
	printf("%d", printf("%d", printf("%d", 43)));
}

       这里屏幕上打印的数字为:4321,这就是链式访问。我知道大家有疑问,下面就让我猜猜大家的疑问。

        因为printf函数的返回值是字符的个数。所以首先第一个printf函数在屏幕上打印的是43,是两个字符,然后的返回值为2,第二个printf函数在屏幕上打印的是2,是一个字符,所以返回值为1,最后一个函数在屏幕上打印的是1。由此看来屏幕上打印的应该是4321。

六、函数的声明和定义

       1、函数声明

    (1)声明是告诉编译器存在一个函数,包括这个函数名、函数类型和参数,但是函数是否已创建,声明并不能决定。

    (2)声明一般出现于函数调用之前,要满足“先声明后使用”。

    (3)函数声明一般是放在头文件中,而函数的实现则是放在源文件中。

       2、函数定义

       函数的定义是指函数的具体实现,交待函数的功能实现。

 七、函数的递归和迭代

         1、函数的递归

       (1)首先介绍一下什么是函数的递归。递归是一种在程序中广泛应用的算法,递归的本质是自己调用自己,递归比较好想到,能够通过大事化小的简单代码解决复杂化问题。递归的主要思考方式是:把大事化小

       (2)递归有两个必要的条件:<1>存在限制条件,当满足这个限制条件的时候,递归便不再继续。<2>每次递归调用之后越来越接近这个限制条件。

void print(unsigned int n)
{
	if (n > 9)
	{
		print(n / 10);
	}
	printf("%d ", n % 10);
}
int main()
{
	unsigned int num = 0;
	scanf("%u", &num);
	//递归 - 函数自己调用自己
	print(num);//print函数可以打印参数部分数字的每一位
	return 0;
 }

下图为这个题的详细过程。

         2、函数的迭代

        函数的迭代就是我们前面学的循环语句,通过限制条件不断更改自身(迭代)直至完成需求。

八、函数的练习

        题目:用递归的方式实现n的k次方。

#include<stdio.h>

double Pow(int n,int k)
{
	if (k == 0)
		return 1.0;
	else if (k > 0)
		return n * Pow(n, k - 1);
	else
		return 1.0 / (Pow(n, -k));//k可能是负数
}
int main()
{
	int n = 0;
	int k = 0;
	scanf("%d %d", &n,&k);
	double ret = Pow(n, k);
	printf("%lf", ret);
	return 0;
}

        这里面就运用了函数自己调用自己,值得注意的是:当满足k<0这个条件时,返回类型是double型。刚开始很容易忽略掉k<o的这种情况。

       最后,恭喜大家已经阅读完整个专栏。一般而言,不管是书籍也好,视频课程也罢,能够完整跟下来的就已经很不容易了。多半原因要归功于这些材料的内容上,大多时候需要读者对材料进行再次整合、加工、理解。虽然我尽量以通俗易懂的形式,将内容体现出来,但水平毕竟有限,忘大家海涵,如果本文有不足或错误的地方,欢迎指出,我会在第一时间改正!
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

x一季花开成海x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值