学习总结,分享快乐。 望指正错误, 共同提高!!!
分类: C/C++
2015-04-29 16:48:00
1> 概述
变量类型 |
作用域 |
链接属性 |
存储方式 |
内存类型 |
自动变量(局部变量) |
代码块 |
无 |
动态 |
栈 |
寄存器变量 |
代码块 |
无 |
动态 |
寄存器 |
外部变量(全局变量) |
文件 |
外部 |
静态 |
数据段/BSS段 |
具有内部内部链接的静态 |
文件 |
内部 |
静态 |
数据段/BSS段 |
无连接的静态 |
代码块 |
无 |
静态 |
数据段/BSS段 |
Note:
不要把变量类型与变量的属性混淆。
Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2> 概念
1》作用域属性:程序中该标志符可以使用的区域。
代码块作用域 |
{ … } |
文件作用域 |
>函数之外定义的变量; >函数名也具有文件作用域; |
函数原型作用域 |
只适用于函数原型中。名字随便取,没有都可以,类型不可少。 |
函数作用域 |
只适用用于goto语句。 一个函数中所有语句标签必须唯一。 |
2》链接属性:
源码有: a.c, b.c, d.c
gcc -c 后: a.o , b.o, c.o
ld a.o, b.o, c.o 这时为题来了:每个.c 都定义过int i;怎么办?
链接属性就是在链接时解决这些问题。
外部链接属性 |
多个.c,多次声明,对应1个实体。 |
内部链接属性 |
同一个.c 中,多个声明,对应1个实体,不同.c对应多个实体。 |
无链接属性 |
多个声明对应多个不同实体 |
声明链接属性的关键字:
extern: 只是声明 标志符的链接属性为外部的, 也就是说,这个标志符在别的地方定义过了。
1》实例说明
例1>>a.c :
点击(此处)折叠或打开
# ./a.out
# a = 10;
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
定义:创建变量或分配存储单元。
声明:说明变量的性质,并不分配存储单元。
Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
例2> a.c:
点击(此处)折叠或打开
b.c:
点击(此处)折叠或打开
gcc
*.c
./a.out
a = 10
b.c = 10
思考 这是为什么,看注释。
Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
思考个问题?
既然 如上述代码, 程序会默认添加extern,
那么为什么,还要用头文件:extern声明变量和函数呢????
在《头文件的作用》研究这个问题。
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
static :只对缺省链接属性为外部连接属性的变量声明,才使链接属性变为内部的。
我的理解:static修饰 函数和外部变量时, 使之成为私有的。(注意:它有2个作用)。
Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
3》存储方式:
动态存储: (auto修饰) |
程序在执行到声明的动态存储类型的变量时,动态存储类型的变量,才被创建,当程序执行流离开该代码块时,动态存储类型的变量自动销毁。 |
静态存储: (static修饰) |
程序整个执行过程中一直占据存储空间。注意:修改变量的存储类型并不修改变量的作用域。 |
4》内存类型:没什么可说的。