C语言的底层逻辑剖析函数篇(其一),0基础搞定函数,超详解

什么是函数?

在C语言中我们如果想要完成一项大的工程,不可能将全部内容一步步敲出来,所以我们引入了函数的概念,一个个的函数就像一个个小的工具一样,来帮助我们进行程序的编写,既节省了时间,又可以在一定程度上提升代码的可读性和效率,函数作为一个个相对独立的部分而存在,提供的功能总结来说是对代码的封装和隐藏,什么意思呢,我们举个例子来帮助理解,比如我们常用的printf函数和scanf函数,我们都知道这两个一个是输出,一个是输入,但是你仔细想想,这两个函数是怎么来实现的呢?你可能并不了解,这就是对过程的封装和对细节的隐藏。

库函数

我们都知道在C语言中提供了一系列的库函数,那么为什么要研发出这些库函数呢?其实在早期C语言中是没有库函数这个概念的,即使是最简单的printf也是程序员自己来写,那么这时候就出现了一些问题,每个程序员写出的函数可能都不相同,大家的水平有高有低,甚至会写出一些bug出来,这时候国际组织就定义的一系列的库函数来作为标准,既然有些函数是大家经常用的,我们就直接定义一个标准的库给出一系列的函数,你直接拿去用就可以了,为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行开发。

C语言中库函数如此的多,那么我们如何来学习这么多库函数呢,我们来看一下:www.cplusplus.com,这里给出一个可学习的网站,我们以这个来举例,打开后直接可以在搜索框中来搜索你需要了解的函数比如我们来搜索strcpy,界面如下:
在这里插入图片描述
从这里面我们就可以看到strcpy的用法,关于它的描述,包括下方也举出了示例来帮助理解,当然了如果你觉得英文有点难懂的话也可以看下面这个网站:www.zh.cppreference.com
这个网站其实是C++的官网,当然了C语言和C++是不分家的。这里还是推荐大家学会去看英文版的,因为很多企业内部给出的文献一般都是英文文献,从现在开始培养肯定是一件好事。

自定义函数

我们现在知道了库函数的用途,很容易理解到库函数肯定是不能够解决所有问题的,不然还要程序员做什么,所以自定义函数才是我们真正要重点学习的技能,我们来写一个简单的函数,假设你要求两个数的和,那么用函数应该怎么来解决呢?代码如下:
#include<stdio.h>

int Add(int x, int y)
{
	return (x + y);
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d",&a,&b);
	int sum = 0;
	sum = Add(a,b);
	printf("%d\n",sum);
	return 0;
}

这里就是一个简单函数的举例,我们需要来分析一下函数的构成是哪几部分,首先我们需要有一个函数名,这里我的函数名就是Add,既然是我要调用函数一定要给它参数,Add后括号内就是我给出的参数x和y,类型是整形,我们函数内部要实现两数相加的功能,然后再将两数之和返回来,而返回的同样是整形,所以在函数名之前要加上返回值的类型int。这就是我们函数的各个构成部分,在下面主函数中我们只要将两个参数直接传给Add,它就可以把两数之和给返回来。

这里还有一道练习,判断两个数的较大值,用函数的形式实现,推荐大家自己练习一下,具体代码参考如下:

#include<stdio.h>

int get_max(int x, int y)
{
	return (x > y ? x : y);
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d",&a,&b);
	int ret = get_max(a, b);
	printf("%d\n",ret);
	return 0;
}

函数参数

函数参数主要分为形式参数(简称形参)和实际参数(简称实参),我们需要记住一个结论:对形式参数的改变不会影响实际参数,那么什么是形参呢,其实简单来说就是我们传给函数的参数,这类参数通常生命周期较短,进入函数生成,出函数就销毁,实际参数我们就是我们实实在在定义的参数,在计算机中有自己的存储空间的参数,我们来看一道练习来帮助理解:
我们要将两个数的值进行调换,用函数的形式来实现,代码如下:

#include<stdio.h>

void swap(int* pa, int* pb)
{
	int tmp = 0;
	tmp = *pa;
	*pa = *pb;
	*pb = tmp;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d",&a,&b);
	printf("交换前:a=%d b=%d\n",a,b);
	swap(&a, &b);
	printf("交换后:a=%d b=%d\n",a,b);
	return 0;
}

这个代码我们是需要仔细去研究推敲的,当我们将a和b传过去时,注意我们传过去的是地址,而不是a和b的值,如果并且我们在函数定义时参数定义的也是指针变量,为什么呢,我相信如果你自己一开始写,一定会写成以下形式,

#include<stdio.h>
void swap(int pa, int pb)
{
	int tmp = 0;
	tmp = pa;
	pa = pb;
	pb = tmp;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	printf("交换前:a=%d b=%d\n", a, b);
	swap(a, b);
	printf("交换后:a=%d b=%d\n", a, b);
	return 0;
}

然后你去调试就会发现问题
在这里插入图片描述

这里好像并没有将我的a和b值交换了,不要着急,出了问题我们就要找出来并将它解决,我们调出我们的监视看一下会发现其实pa和pb的地址和a和b的地址是完全不同的,也就是说我们对pa和pb的改变根本不会影响到a和b,我们在函数内部交换的仅仅是pa和pb的值,那么问题就出现在这里,哪门我们将a和b的地址直接传过去交换不就好了吗?所以我们正确的代码就是最开始的那样,还记得我在开头让记住的结论吗:对形式参数的改变不会影响实际参数,相信到这里你已经理解了这句话。一定要记住哦!!!

函数调用

结合上面我们举的几个例子,相信你就很容易可以理解函数调用是怎么个情况,函数调用实际上分为函数传值调用传址调用,传值调用就是我们上面直接将a和b的值传给函数去使用,当我们需要对实际参数进行改变的时候就要考虑传址调用了,直接将参数地址传给函数进行后续操作。

好了,今天关于函数我们只学习这些内容,我们下期再来深入学习函数的其他部分。

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蓝不过海呀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值