C储存类,链接和内存管理学习总结和心得
2016-02-12 23:48
211 查看
C有5种储存类:自动,寄存器,具有外部链接的静态,具有内部链接的静态和具有空链接的静态。
储存类 时期 作用域 链接 声明方式
自动 自动 代码块 空 代码块内
寄存器 自动 代码块 空 代码块内,使用关键字register
具有外部链接的静态 静态 文件 外部 所有函数之外
具有内部链接的静态 静态 文件 内部 所有函数之外,使用关键字static
空链接的静态 静态 文件 空 代码块内,使用关键字static
解释一些关键字:
aotu类型表示该变量的存在时间由函数调用决定,且定义变量时默认使用aotu类型
extern关键字声明表示该变量由外部声明定义,且在此处引用,若引用其他文件定义的变量则必须要使用extern关键字
static表示该变量是静态的,即与整个程序的生存周期相同,同时,static型的变量在编译程序之前进行编译,即除了#提示的预编译内容外,static内容编译的优先级最高,这样造成的特性就是在程序中被static提示的内容不会被重复定义声明,这在函数的递归中很重要。
register表示该变量被放置在寄存器或者较快的内存中,这样的变量可以对程序的运行速度造成一定的优化,然而由于寄存器的特殊性,被该关键字标注的变量无法获得其地址,所以不能对其使用指针(即使该变量被放在了内存中)。
const不做解释。。。。。。。
volatile告诉编译器这是一个易变的变量,即可能被除了用户运行的程序之外的代理所更改,这类变量由于可能会在一些未知的情况下被修改,所以如果对其进行运行优化会产生错误的计算结果,如硬件的时钟等。反过来,非volatile变量即代表该变量的所有调用和变化都被程序所监控,因此编译器可以对其进行适当的计算优化。
restricted只可被用于指针,并表明指针是放弃一个数据对象的唯一且初始的方式,从结果上来说,这样的限定可以使程序的运行更加安全,但可能会使程序的编写变得更加麻烦。
c中还有一个不太常用的作用域被称为函数作用域,这些标记与goto联用,作为跳转的标记,不过由于goto的危害性,这个作用域的存在感如同阿卡林一般............
写一些总结:
没有在代码块内定义而具有全局作用域的储存类或声明方式
c程序编译的顺序:预编译->main外部声明和static变量->main
extern更像是链接的关键字,而不是声明,准确的说extern其实是引用声明的关键字。
向函数传递数据的方法不仅可以使用传值调用,也可以用全局变量,尽管这种方式并不推荐
在多文件编译中,使用static关键字修饰变量,使变量在编译main前完成定义声明,这样就可以不用担心多文件中的重复声明了。
使用全局变量会造成不必要的风险,因为全局变量会被各个函数所修改,所以使用全局变量时最好使用const关键字修饰,使其变为常量。不过既然这么麻烦为什么不用define?
Malloc()和free()是c进行内存管理的基础,也是c的高级数据结构的基础,如链表等。与malloc相似的还有calloc(),其实并没有什么太大的区别,除了自动进行了元素初始化。只是多了这么一个功能就要多写一个库函数.........不嫌麻烦么............
多样性的储存类使c优化一个程序的方法变得十分丰富,不过既然c现在只是用来写底层的东西,那有必要计较这一点运行速度吗.............
储存类 时期 作用域 链接 声明方式
自动 自动 代码块 空 代码块内
寄存器 自动 代码块 空 代码块内,使用关键字register
具有外部链接的静态 静态 文件 外部 所有函数之外
具有内部链接的静态 静态 文件 内部 所有函数之外,使用关键字static
空链接的静态 静态 文件 空 代码块内,使用关键字static
解释一些关键字:
aotu类型表示该变量的存在时间由函数调用决定,且定义变量时默认使用aotu类型
extern关键字声明表示该变量由外部声明定义,且在此处引用,若引用其他文件定义的变量则必须要使用extern关键字
static表示该变量是静态的,即与整个程序的生存周期相同,同时,static型的变量在编译程序之前进行编译,即除了#提示的预编译内容外,static内容编译的优先级最高,这样造成的特性就是在程序中被static提示的内容不会被重复定义声明,这在函数的递归中很重要。
register表示该变量被放置在寄存器或者较快的内存中,这样的变量可以对程序的运行速度造成一定的优化,然而由于寄存器的特殊性,被该关键字标注的变量无法获得其地址,所以不能对其使用指针(即使该变量被放在了内存中)。
const不做解释。。。。。。。
volatile告诉编译器这是一个易变的变量,即可能被除了用户运行的程序之外的代理所更改,这类变量由于可能会在一些未知的情况下被修改,所以如果对其进行运行优化会产生错误的计算结果,如硬件的时钟等。反过来,非volatile变量即代表该变量的所有调用和变化都被程序所监控,因此编译器可以对其进行适当的计算优化。
restricted只可被用于指针,并表明指针是放弃一个数据对象的唯一且初始的方式,从结果上来说,这样的限定可以使程序的运行更加安全,但可能会使程序的编写变得更加麻烦。
c中还有一个不太常用的作用域被称为函数作用域,这些标记与goto联用,作为跳转的标记,不过由于goto的危害性,这个作用域的存在感如同阿卡林一般............
写一些总结:
没有在代码块内定义而具有全局作用域的储存类或声明方式
c程序编译的顺序:预编译->main外部声明和static变量->main
extern更像是链接的关键字,而不是声明,准确的说extern其实是引用声明的关键字。
向函数传递数据的方法不仅可以使用传值调用,也可以用全局变量,尽管这种方式并不推荐
在多文件编译中,使用static关键字修饰变量,使变量在编译main前完成定义声明,这样就可以不用担心多文件中的重复声明了。
使用全局变量会造成不必要的风险,因为全局变量会被各个函数所修改,所以使用全局变量时最好使用const关键字修饰,使其变为常量。不过既然这么麻烦为什么不用define?
Malloc()和free()是c进行内存管理的基础,也是c的高级数据结构的基础,如链表等。与malloc相似的还有calloc(),其实并没有什么太大的区别,除了自动进行了元素初始化。只是多了这么一个功能就要多写一个库函数.........不嫌麻烦么............
多样性的储存类使c优化一个程序的方法变得十分丰富,不过既然c现在只是用来写底层的东西,那有必要计较这一点运行速度吗.............
相关文章推荐
- 数据库链接字符串查询网站
- 如何获得外部优质网站的链接pr
- Lua的内存管理浅析
- html链接与文本标签们
- 详解链接的rel与target区别
- 一个链接按两种方式打开两个网址的方法
- MS SQL Server2014链接到MS SQL Server 2000的解决方案及问题处理
- php自动给网址加上链接的方法
- 用CSS实现链接的虚线下划线效果
- ASP为字符串中的网址自动加上链接
- 跟我学习JScript的Bug与内存管理
- 获取内联和链接中的样式(js代码)
- ASP.NET列出数据库活跃链接的方法
- JQuery 实现在同一页面锚点链接之间的平滑滚动
- 跟我学习javascript的垃圾回收机制与内存管理
- jQuery匹配文档链接并添加class的方法
- 实例详解JavaScript获取链接参数的方法
- php实现使用正则将文本中的网址转换成链接标签
- phpMyAdmin链接MySql错误 个人解决方案
- 使用delegate方法为一个tr标签加一个链接