代码,功能为了更好地实现模块化编程。那么,什么是函数的性质?在函数中定义的变量(全局变量、局部变量、静态变量)如何存储?为什么范围和全局变量和局部变量的寿命是不一样的?只是有一个更深入的了解的功能。能够回答这些问题!

★函数的本质

函数的本质是一段可运行的机器指令代码,函数名的本质是一个标号。表示函数代码的入口。该标号的值等于内存中存储函数代码的内存空间的首地址。

★变量

●全局变量

全局变量也就是外部变量。定义在函数的外部。

因此它不属于不论什么一个函数,仅仅属于所在的源文件。

▲初始化

对于全局变量来说。假设没有被初始化,其值由编译器自己主动设置为0。因此,使用一个全局变量不用考虑它的初始化问题。

执行结果:

▲作用域和生命周期

其作用域从定义该变量的这一行開始到定义该变量的源文件结束,在此期间,全部的函数都能够引用该变量。这里有一点要注意:全局变量作用域的范围并非从程序的開始一直到程序的结尾,而是从定义这个变量的開始处到程序的结尾。

有这样一种情况:在一个源文件里,定义全局变量之前已经定义了一个函数A。那么A就不能引用这个全局变量。假设非要引用这个变量,那么就先在A之前声明这个全局变量。

●局部变量

局部变量也成为内部变量,它定义在函数或者复合语句的内部。

▲初始化

假设局部变量未被初始化。那么直接引用会非常危急。

由于局部变量存储于内存的堆栈中。

定义了局部变量之后,编译器不会将其初始化为0,而是此内存空间原来的值。那么这个值是一个随机值。最后就可想而知了。因此。局部变量一定要记得初始化!

执行结果:

▲作用域和生命周期

由于它定义在函数内部或者复合语句的内部。因此,其作用域仅限于函数或者符合语句内。

★变量存储

源文件里,不同的变量存储在不同的区域内。

一个程序在执行期间会占用内存,而且内存的使用情况也不同。通常会分为:数据段、代码段、堆栈段、BSS段

●BBS段(Block Started by Symbol)

通经常使用来存储未初始化全局变量和静态变量的一块区域。BSS段属于静态内存分配。在程序运行之前,BSS段会自己主动清零。

这也就是前面全局变量不用初始化的原因。

●代码段

用来存放程序的执行代码。这段内存在程序执行之前就已经确定。

●数据段

通经常使用来存放已经初始化的全局变量和静态变量。属于静态内存分配。

●堆

用来存放程序动态分配的内存空间。大小不固定。

可扩张、可缩减。当调用malloc函数时,就是从堆上分配内存。内存空间扩大;调用free函数时,堆上内存空间就会缩减。

●栈

用来存放函数内部定义的局部变量(注意:不包含static声明的变量,一般存储在数据段中)。

在函数被调用时。其參数也会被压入发起调用的堆栈中。而且待到调用结束后。函数的返回值也会被放会栈中。因为栈的先进后出的特点,所以栈特别方便用来保存/恢复调用现场。从这个意义来讲,我们能够把堆栈看成一个寄存、交换暂时数据的内存区。

★函数有关的优化

●函数调用优化

函数的作用是使代码模块行增强,有利于代码的阅读和改动,能够有效的缩减代码的体积。

可是函数调用是非常费时的,一个函数调用一般有4步:

1、需将參数压入堆栈

2、须要保存寄存器的值

3、须要保存返回地址

4、会造成跳转

这四步中以上3步都须要訪问内存。訪问内存是非常消耗时间的。假设程序中调用函数过多,其运行的速度肯定会非常慢。因此在程序运行过程中。应该尽量降低不必要的函数调用,这样才干提高程序的运行速度。

●变量存储优化

因为局部变量存储在栈上,全局变量存储在数据段上。

因为两者的存储位置不同导致生命周期的不同。

对于程序中调用非常高的局部变量。编译器会自己主动将其存储在寄存器中,可是全局变量不会被存储在寄存器中。由于全局变量在整个程序中一直存在。假设全局变量存储在寄存器中,那么寄存器就无法存储暂时变量或者中间值。

计算机中。寄存器资源本来就稀少,程序的执行效率也不高效率。因此,全局变量必须存储在一个数据段。那就是存储器。最大限度地减少内存访问还提高程序运行速度的方法。(地处注册CPU在,它的特征是:小容量。快。假设一些变量经常使用,在此变量被存储在寄存器。这将减少内存运行频率,从而节省了时间)

【C语言学习】C语言功能的更多相关文章

  1. C语言学习 第八次作业总结

    本次作业其实没有新的内容,主要就是复习上一次的一维数组的相关内容.冯老师布置了5道题目,其中涉及到一些比较简单的排序或者是查找的方法.因为数据很少,所以直接使用for循环遍历就可以了. 关于本次作业, ...

  2. C语言学习 第七次作业总结

    C语言学习 第七次作业总结 数组可以分为数组和多下标数组(在传统的国内C语言书本中,将其称为二/多维数组). 数组名称 在之前的课程中,大家应该都有印象,对于int a这样的定义,会为变量 a 声明一 ...

  3. 技能收获与C语言学习

    你有什么技能比大多人(超过90%以上)更好? 我会的东西很多,喜欢的东西太多,但是很遗憾广而不专,会而不精.学了很多东西我都是为了娱乐,因为以前我们那里过于强调学习,很多爱好也都被扼杀在摇篮里.我觉得 ...

  4. 一份关于Swift语言学习资源的整理文件

    一份关于Swift语言学习资源的整理文件     周银辉 在这里下载 https://github.com/ipader/SwiftGuide

  5. go语言学习笔记

    Go语言学习基本类型Bool 取值范围:true,false (不可以用数字代替)Int/uint 根据平台可能为32或64位int8/uint8 长度:1字节 取值范围-128~127/0~255b ...

  6. 20155206赵飞技能获取经验,C语言学习感想与对JAVA的学习目标

    自己较强的技能获取经验. 1:实话实说我自己是没有哪个技能可以超过90%的人的,只有自认为做的还可以的一些事情,例如打篮球,office软件的应用,一百米跑.至于其他方面就是很平庸了. 2:经验主要有 ...

  7. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

  8. 20155229-付钰涵-分析自我技能延展到c语言学习状况

    我的小技能 我记得幼儿园时表演的舞蹈,也记得从水彩到素描的学习,还记得小学和初中获得的钢琴省级奖项. 舞蹈止于一年级,绘画止于三年级,钢琴从学前班到高一那十年的时间里有过断续. 03年-04年的那个冬 ...

  9. linux 下C语言学习路线

    UNIX/Linux下C语言的学习路线.一.工具篇“公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工 ...

  10. [go语言学习指南]

    内部分享,根据自己的经验,收集汇总的go语言学习指南. 适合新手入门. 可以通过这里进行下载.

随机推荐

  1. UI组件之TextView及其子类(三)ToggleButton和Switch

    ToggleButton.Switch.CheckBox和RadioButton都是继承自android.widget.CompoundButton,意思是可选择的,因此它们的使用方法都非常类似. C ...

  2. 立足“快时尚”,联想笋尖S90怎样诠释“比美更美”?

        现现在."快时尚"已经成为广受年轻人追捧的消费观,从服装界的H&M.ZARA到餐饮界的绿茶.外婆家等等,我们都不难看出,快时尚已成为激发年轻人消费欲望的核心元素,并 ...

  3. JAVA: Socket和ServerSocket网络编程

    面是本次学习的笔记.主要分异常类型.交互原理.Socket.ServerSocket.多线程这几个方面阐述. 异常类型 在了解Socket的内容之前,先要了解一下涉及到的一些异常类型.以下四种类型都是 ...

  4. php面试题9(看的时候就应该随手截图做笔记的)

    php面试题9(看的时候就应该随手截图做笔记的) 一.总结 看的时候就应该随手截图做笔记的 二.php面试题9 一.选择题:1.下面哪个表达式不能将两个字符串$s1 和$s2 串联成一个单独的字符串? ...

  5. Android shape画圆点

    <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http: ...

  6. jquery formcheck.js

    demo下载链接http://pan.baidu.com/s/1hrDCC3y     /* Jquery 表单验证插件 janchie 2010.1 janchie@163.com 1.01版 */ ...

  7. 【hdu 1864】最大报销额

    Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...

  8. SimpleDateFormat.format的简单使用小结

    format的用法 是将当前时间格式转换为指定格式 场景一:给定毫秒数或者当前系统时间,返回指定时间格式 输入         Date date=new Date();//获得系统当前的时间 //  ...

  9. 三星语音AI助理背后的华人身影—73岁科技人三度创业成功(孙子兵法:道、天、地、将、法)

    我绝对不当老二,也不当老大,我要当霸主!”说这句话的是富迪科技董事长黄炎松.他还把“独霸”当作公司愿景宣言,大剌剌的放在美国总公司进门最显眼的墙上.   集微网消息,据台湾商业周刊报道,黄炎松,是台湾 ...

  10. 写bug-free 的code

    一个算法题目 写的没有bug,是件不easy的事情 必需要考虑全面,事实上就是你算法过程中,每一个变量是否适用,你的算法是在什么样的前提以下展开的 这个和參数检查是另外一件事情.參数检查被说的好像是一 ...