Chinaunix首页 | 论坛 | 博客
  • 博客访问: 219949
  • 博文数量: 39
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 584
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-18 20:24
个人简介

学习总结,分享快乐。 望指正错误, 共同提高!!!

文章分类

全部博文(39)

分类: 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 :


点击(此处)折叠或打开

  1. #include
  2. int main(void) {

  3.         extern int a;      //这是显示声明 a 的链接属性为 外部的。

  4.         printf("a = %d\n", a);

  5.         return 0;
  6. }

  7. int a= 10;                      //这是定义。定义一个变量,与链接属性无关系。说连接属性都是在声明中。
测试:
         # gcc a.c

         # ./a.out 

         # a = 10;

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


定义:创建变量或分配存储单元。

声明:说明变量的性质,并不分配存储单元

Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


2> a.c:


点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int a=10;        //这是定义

  3. int main(void)
  4. {
  5.         extern int a;        //这是声明 a 的链接属性为 外部的。 这句一般都省略掉

  6.         printf("a = %d\n", a);

  7.         cc();             //这是缺省情况 ,默认相等于 extern void cc(void); cc();

  8.         return 0;
  9. }


b.c:

  

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int a;              // 这是缺省情况,默认 相等于 extern int a ; 你最好不要省略!!

  3. void cc(void)
  4. {
  5.         printf("b.c = %d\n", a);
  6.  }

测试:


         gcc *.c
        ./a.out

        a = 10

        b.c = 10


思考 这是为什么,看注释。

Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

思考个问题?

                
既然 如上述代码, 程序会默认添加extern

                
那么为什么,还要用头文件:extern声明变量和函数呢????

                在《头文件的作用》研究这个问题。

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

static 只对缺省链接属性为外部连接属性的变量声明,才使链接属性变为内部的。

我的理解:static修饰 函数和外部变量时, 使之成为私有的。(注意:它有2个作用)。

Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


3》存储方式:

动态存储:

auto修饰)

程序在执行到声明的动态存储类型的变量时,动态存储类型的变量,才被创建,当程序执行流离开该代码块时,动态存储类型的变量自动销毁。

静态存储:

static修饰)

程序整个执行过程中一直占据存储空间。注意:修改变量的存储类型并不修改变量的作用域。


4》内存类型没什么可说的


阅读(1834) | 评论(0) | 转发(0) |
0

上一篇:递归调用

下一篇:APCS 2》实例

给主人留下些什么吧!~~