您的位置:首页 > 编程语言 > C语言/C++

C语言之变量的作用域及存储方式

2013-08-22 10:31 435 查看

1.变量的作用域:

变量的作用域分为局部变量、全局变量和外部变量。

1. 局部变量

局部变量是在函数内定义的变量,其作用域仅限于函数内,在函数内才引用,即可以对它赋值或取值。在作用域外,使用它们是非法的。

2.全局变量

全局变量是定义在函数之外的变量,它的作用域是从定义处开始,到所在文件的结束。即从定义之处起,它可以在文本的所有函数中使用。

【全局变量的命名最好取有特殊含义的标识符(例如在变量名前加q_)。防止不经意间改变了它的值。

3.外部变量

全局变量的作用域是在所在文件的整个文件,而一个文件中的全局变量的作用域还可以扩展到其它文件。某个文件中引用另一个文件中的全局变量,只要用extern声明,说明这个变量是在其它文件中已经定义过的外部变量。那么,该文件中不会为外部变量分配内存。

说明:
1.外部变量的定义和应用的差别
外部变量的定义其实就是定义一个全局变量。例如int a;
但是外部变量的引用需要在变量前加上一个extern int a;同时这时不用有初始化。
个人建议:在定义外部变量的时候最好省略extern类别,并提供一个显式的初始化值:int a = 0 ;在引用性声明中,使用存储类别extern,并且不要包含初始化值:extern int a ;
【注意】

外部变量的引用类型必须和其定义类型一致!
2.同一源文件中,允许全局变量和局部变量同名,但在局部变量的作用域内,全局变量不起作用。【即当全局变量与局部变量相遇,局部变量屏蔽全局变量】

2.变量的存储方式

在C语言中,变量除了有类型之分,还有四种存储类别:自动存储变量,静态存储变量,外部存储变量,寄存器存储变量。

(1).自动存储变量

1.性质:

--作用域的局部性,其作用域为变量定义所在的模块(一对花括号围起来的部分)内或函数内。

--生存期的暂时性,其生存期为该变量定义所在的函数或模块的执行周期。即一旦进入该函数,c就自动为该变量建立存储区,而一旦退出该函数,c就自动收回此存储区。

--未初始化的变量其值不确定,是无意义的。

(2)定义 关键字auto(也可无),auto int i,j;

举例:

main()

{

int i=100,k=80;

printf("i=%d\n",i);

{

int i=200;

printf("i=%d k=%d\n",i,k++);

}

printf("i=%d k=%d",i,k);

getch();

}

(2)静态存储变量

1.定义: static 数据类型 变量名=初值;

2.种类: 全局和局部两种。

-静态局部存储变量,仅能在所定义的模块内存使用,与AUTO变量不同,它可以保持原值不便:

count_up()

{

static int number=25;

number+=25;

return(number);

}

-静态全局变量,

.性质:作用域-整个程序。生存期的永久性,未初始化的静态变量值为0;

3.静态变量和自动存储变量的区别。

main()

{

count_up();

count_up();

printf("\n");

add();

add();

getch();

}

count_up()

{

static int num0=0;

num0+=25;

printf("%d\t",num0);

}

add()

{

auto int num1=0;

num1+=25;

printf("%d\t",num1);

}

运行结果:

25 50

25 25

(3)外部存储变量

1.用途 用于把大程序分隔若干单元(文件)而开发的场合。说明外部存储变量使用关键字extern。

(4)寄存器存储变量

关键字:register 如:register int e;

寄存器存储变量值存储在CPU的寄存器中,设定这种变量主要是为了提高操作速度。他们常用于循环控制。使用SI,DI寄存器。如果定义寄存器变量超过两个,则多余的按照自动存储变量对待。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: