C语言使用函数必须知道的3点注意事项!
C语言是面向过程的,而C++是面向对象的
C和C++的区别:
C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。
C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。
C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。
这次与大家分享的是我对 C 语言中函数使用注意事项的小短文,希望能帮助有疑惑的同学更好的使用这个强大的语言特性。
大家在高中的时候都求过数学函数的表达式,其实编程语言的函数与数学表达式实际上是一样的。
我们都可以将其理解为一个有输入有输出的「功能黑箱」,看下图:
就类似给函数一个 x 值,可以求结果一样,给函数一些输入参数,也可以得到相同的输出结果。
C/C++交流裙815393895
1. 模块化编程
为什么要使用函数呢?其实是为了更好的维护软件的功能以及实现模块化编程。
你可以想下如果把所有的功能都写在 main 函数中,那该多么可怕,估计没人会读你写的代码。
通过使用函数可以使我们的软件逻辑性更强,单独的功能写在单独的函数中,还可以方便后期复用等等,好处还有很多实在列举不完。
其中比较重要的作用要说:模块化编程和代码复用了,建议你去找实际的项目看看代码组成,自然就理解了。
2. 函数的副本机制
很多初学者都搞不清楚函数的副本机制,例如下面的交换函数:
这个函数是错误的,因为函数在进行参数传递的时候,会将传入参数 m,n 的值拷贝给函数的形式参数 a,b。
因此在函数内部交换的是形式参数 a,b 的值,而不是交换传递时 m,n 变量的值。
函数的副本机制从内存的角度来说就是:在函数进行参数传递的时候,实参和形参的内存地址是不同的。
这是这个例子的输出结果,每个人的机器可能都不同:
C/C++干货裙815393895
可以看到变量 m 和 a,以及 n 和 b 的内存地址均不同,因此对值的交换也是不起作用的。
但是使用指针就完全不同了,看下面这个例子:
这个函数才是正确的交换函数,为什么呢?
因为我们这里传递的是 m,n 的内存地址,即传递的是指针,所以在函数内部对指针解除引用就可以直接访问这个地址的内容了,这是指针提供的特性。
那么是否就意为着传递指针就没有副本机制了呢?这也是错误的,指针也是变量,本质上与 int 没有区别,只是特性不同罢了。
上面例子在传递指针的时候,也是将 m,n 的地址拷贝给 pa,和 pb,也是存在副本机制的。
只不过这里拷贝的是地址而不是值,在内部通过指针的解引用操作可以直接访问 m,n 的内存地址,进而进行交换。
因为指针非常重要,所以建议你自己运行这个程序,可以看到输出结果中 pa 指向的是 m 的内存地址,而 &pa 是指针变量 pa 的内存地址,这两个千万不要搞混了。
一定时时刻刻记住下面的结论:
1. 一个 int 变量有自己的内存地址,也有自己存储的整数值
2. 一个指针变量有自己的内存地址,也有自己存储的指向地址值
3. 变量在内存中都有自己的地址和其存储的内容
C/C++交流裙815393895
3. 函数的参数传递顺序
VC 和 gcc 编译器计算函数参数的顺序都是从右向左,这个特点一点要记住,面试可能会问到。
你可以使用下面这个程序去验证,程序比较简单,留作给你的思考(不去思考就等于浪费时间看 cd 这篇文章了):
好了,今天就到这里。
写在最后
编程最重要的练,重复写。
作者:CC我的
C语言使用函数必须知道的3点注意事项!相关推荐
- C语言编程学习:使用函数必须知道的3点注意事项
C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...
- python语言必背代码-Python新手必须知道的25条知识点
原标题:Python新手必须知道的25条知识点 1.到底什么是Python?你可以在回答中与其他技术进行对比 下面是一些关键点: Python是一种解释型语言.这就是说,与C语言和C的衍生语言不同,P ...
- c 多文件全局变量_必须知道的C语言知识细节:C程序编译后内存到底是如何布局...
「今天是学习C语言第 116 天」 当你选择了一种语言,意味着你还选择了一组技术.一个社区.--Joshua Bloch C语言程序编译以后,代码和数据都必须存放在内存中由CPU执行.理解C程序内存是 ...
- 你必须知道的495个C语言问题电子书pdf下载
你必须知道的495个C语言问题下载链接: https://pan.baidu.com/s/1UlMaEhv2cqzlWgd_8XQ3rg 提取码获取方式:关注下面微信公众号,回复关键字: 1131
- [你必须知道的.NET]第二十三回:品味细节,深入.NET的类型构造器
1 引言 今天Artech兄在<关于Type Initializer和 BeforeFieldInit的问题,看看大家能否给出正确的解释>一文中让我们认识了一个关于类型构造器调用执行的有趣 ...
- [你必须知道的.NET]第十四回:认识IL代码---从开始到现在
本文将介绍以下内容: · IL代码分析方法 · IL命令解析 · .NET学习方法论 1. 引言 自从『你必须知道.NET』系列开篇以来,受到大家很多的关注和支持, ...
- 系统管理员必须知道的PHP安全实践
系统管理员必须知道的PHP安全实践 PHP是一种开源服务器端脚本语言,应用很广泛.Apache web服务器提供了这种便利:通过HTTP或HTTPS协议, 访问文件和内容.配置不当的服务器端脚本语言会 ...
- 一本你必须知道的.net
<你必须知道的.NET> 作者简介:王涛 微软C# MVP,高级软件工程师,机械工程硕士,主要研究方向为.NET底层架构和企业级系统应 用.现就职于某软件公司负责架构设计.软件开发和项目管 ...
- 数据人必须知道的SQL概念(A-Z)
作为数据从业者,大家用的最多的应该就是SQL语言了,那么除了日常的select,你还了解哪些SQL相关的概念呢?今天就按照字母表的顺序(A-Z)来给大家简单介绍一下数据人必须知道的SQL概念大全. A ...
最新文章
- 如何使用wipefs命令擦除磁盘上的签名
- 【sparkStreaming】将DStream保存在MySQL
- 逐行分析Hadoop的HelloWorld
- JSP+JavaBean+Servlet工作原理实例…
- MySQL下bin-log的三种模式(ROW、Statement、Mixed)
- rust笔记12 单元测试
- datalist 给输入框绑定文本提示(大部分浏览器不支持)
- Smart Link与Monitor Link技术
- ExpandableListView实现组内单选,组间多选功能
- R12-表详解-总帐
- 电影院售票系统mysql表格_电影院票务管理系统数据库设计(1)
- Codeforces 1102F Elongated Matrix 状压dp
- 怎么在html模板里加图片,页面中添加图片模块并编辑
- 2018杭州云栖大会免费送票啦!
- java 运费_如何在Java中创建运费成本计算器
- 仿今日头条后台管理系统(三)
- 试画出下面系统的乃式图(nyquist图)【Matlab】
- 各大容器常用的库(2021-12-10更新)
- Android 常用正则表达式,2021年Android大厂面试分享
- 如何修改Android的ro属性
热门文章
- word、excel、ppt 办公文件 在线预览
- VS Code vue 模板
- centos7安装rabbitmq简单方式
- MyBatis-Plus_LambdaQueryWrapper
- 漂亮的带分步说明的 VBA 自制进度条
- Excel VBA 处理图形图表详解
- JS 打印 data数据_数据表格 Data Table - 复杂内容的15个设计点
- os是android5.0,Funtouch OS 2.1曝光 完美改Android5.0
- 计算机对环境的影响的案例,计算机环境下的呈现方式对学生样例学习的影响
- Python return逻辑判断表达式 - 零基础入门教程