新手入门C语言编程:使用函数必须知道的三点注意事项!

C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。

C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。

C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。

C 语言中函数使用的注意事项,你们知道吗?希望能帮助有疑惑的同学更好的使用这个强大的语言特性。

大家在高中的时候都求过数学函数的表达式,其实编程语言的函数与数学表达式实际上是一样的。

我们都可以将其理解为一个有输入有输出的「功能黑箱」,看下图:

就类似给函数一个 x 值,可以求结果一样,给函数一些输入参数,也可以得到相同的输出结果。

1. 模块化编程

为什么要使用函数呢?其实是为了更好的维护软件的功能以及实现模块化编程。

你可以想下如果把所有的功能都写在 main 函数中,那该多么可怕,估计没人会读你写的代码。

通过使用函数可以使我们的软件逻辑性更强,单独的功能写在单独的函数中,还可以方便后期复用等等,好处还有很多实在列举不完。

其中比较重要的作用要说:模块化编程和代码复用了,建议你去找实际的项目看看代码组成,自然就理解了。

2. 函数的副本机制

很多初学者都搞不清楚函数的副本机制,例如下面的交换函数:小编推荐一个学C语言/C++的学习裙【 六二七,零一二,四六四 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

这个函数是错误的,因为函数在进行参数传递的时候,会将传入参数 m,n 的值拷贝给函数的形式参数 a,b。

因此在函数内部交换的是形式参数 a,b 的值,而不是交换传递时 m,n 变量的值。

函数的副本机制从内存的角度来说就是:在函数进行参数传递的时候,实参和形参的内存地址是不同的。

这是这个例子的输出结果,每个人的机器可能都不同:

可以看到变量 m 和 a,以及 n 和 b 的内存地址均不同,因此对值的交换也是不起作用的。

但是使用指针就完全不同了,看下面这个例子:

这个函数才是正确的交换函数,为什么呢?

因为我们这里传递的是 m,n 的内存地址,即传递的是指针,所以在函数内部对指针解除引用就可以直接访问这个地址的内容了,这是指针提供的特性。

那么是否就意为着传递指针就没有副本机制了呢?这也是错误的,指针也是变量,本质上与 int 没有区别,只是特性不同罢了。

上面例子在传递指针的时候,也是将 m,n 的地址拷贝给 pa,和 pb,也是存在副本机制的。

只不过这里拷贝的是地址而不是值,在内部通过指针的解引用操作可以直接访问 m,n 的内存地址,进而进行交换。

因为指针非常重要,所以建议你自己运行这个程序,可以看到输出结果中 pa 指向的是 m 的内存地址,而 &pa 是指针变量 pa 的内存地址,这两个千万不要搞混了。小编推荐一个学C语言/C++的学习裙【 六二七,零一二,四六四 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

一定时时刻刻记住下面的结论:

1. 一个 int 变量有自己的内存地址,也有自己存储的整数值

2. 一个指针变量有自己的内存地址,也有自己存储的指向地址值

3. 变量在内存中都有自己的地址和其存储的内容

3. 函数的参数传递顺序

VC 和 gcc 编译器计算函数参数的顺序都是从右向左,这个特点一点要记住,面试可能会问到。

你可以使用下面这个程序去验证,程序比较简单,留作给你的思考(不去思考就等于浪费时间看 cd 这篇文章了):

编程最重要的练,重复写,写到自己得心应手,滚瓜烂熟,就像刻在心里了一样,这就是达到了一种境界,小编我还没有达到这种境界,因为人有惰性,希望你们可以克服,可以达到最高境界!

我有一个微信公众号,经常会分享一些C语言/C++技术相关的干货;如果你喜欢我的分享,可以用微信搜索“C语言学习部落”关注

欢迎大家加入千人交流答疑裙:627+012+464

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏老秦求学

算法三之归并排序

快速排序,应用到分治法。 下面先了解一下什么是分治法? 分治法,顾名思义,分而治之。先将问题进行分解,然后将分离的问题进行求解,最后将所有分离的解进行合并,得到...

35513
来自专栏Linyb极客之路

简洁又快速地处理集合——Java8 Stream(上)

本篇文章主要是让大家能够理解 Stream,理解它的基本原理,理解我们为什么需要使用 Stream 以及它的好处,而具体的实战环节我会在下篇文章中讲解。

4275
来自专栏我和我大前端的故事

数组对象根据对象中指定的属性去重?你知道多少

有一天有一个朋友给我发来消息 “数组对象根据对象中指定的属性去重?让我写写看”,看到这个的时候我有点懵逼,好像不太会。

5203
来自专栏灯塔大数据

技术 | Python从零开始系列连载(十八)

可迭代对象:在之前学习的基础上,可以简单的理解为可以用for循环遍历的,如学过的list tuple dict set str

1001
来自专栏CDA数据分析师

如何拿到半数面试公司Offer——我的Python求职之路

从八月底开始找工作,短短的一星期多一些,面试了9家公司,拿到5份Offer,可能是因为我所面试的公司都是些创业性的公司吧,不过还是感触良多,因为学习Python...

2688
来自专栏阮一峰的网络日志

函数式编程初探

诞生50多年之后,函数式编程(functional programming)开始获得越来越多的关注。 不仅最古老的函数式语言Lisp重获青春,而且新的函数式语言...

3726
来自专栏Create Sun

设计模式--------工厂模式

前言   两个月前写过一次设计模式系列,但很不满意就删除了。显然希望能做到学以致用,而非看书总结,设计模式绝对是你解决问题的一个思路,但在这有点自己的小建议,设...

3458
来自专栏xingoo, 一个梦想做发明家的程序员

第一章 对象导言 第二章 对象的创建与使用

1 抽象过程 2 对象接口 3 实现隐藏 4 重用 5 继承:重用接口 6 多态性:互换对象 7 创建销毁对象 8 异常处理:应对错误 9 分析...

18310
来自专栏java一日一条

java工厂模式三种

适用场合: 7.3 工厂模式的适用场合 创建新对象最简单的办法是使用new关键字和具体类。只有在某些场合下,创建和维护对象工厂所带来的额外复杂性才是物有所...

701
来自专栏java一日一条

如何拿到半数面试公司Offer——我的Python求职之路

从八月底开始找工作,短短的一星期多一些,面试了9家公司,拿到5份Offer,可能是因为我所面试的公司都是些创业性的公司吧,不过还是感触良多,因为学习Python...

861

扫码关注云+社区

领取腾讯云代金券