全局变量,寄存器变量,外部变量

全局变量与静态全局变量的主要区别是:作用域不同.

全局变量的作用域不仅在本文件中可以使用,在其他文件中也可以使用.但静态全局变量只能在本文件中使用.

如假设在1.cpp里定义了一个全局变量int g_val=1;一个静态全局变量int s_val=2

在2.cpp里可以正常使用g_val这个变量,但是不能访问s_val这个变量.

//1.cpp

#include<iostream>
using namespace std;

int g_val=1;
static int s_val=2;
int main()
{
return 0;

}
//2.cpp

extern int g_val;//要加extern关键字
extern int s_val;//虽然这个也可引用
void test()
{
 g_val=0;
 s_val=3;//这里访问出错.
}

 

静态局部变量与一般局部变量的区别就是:生存期不同

静态局部变量的生存期在程序运行期间都存在,下一次会引用上次访问的值.

#include<iostream>
using namespace std;
void fun()
{
 int i=0;//下一次进来的时候这步仍执行,即i又变回0
 static int val=0;//只初始化一次,下一次进来这个函数的时候,val的值是引用上次的值.而不是0
 val++;
 i++;
 cout<<"静态局部变量:"<<val<<endl;
 cout<<"一般局部变量:"<<i<<endl;

}
int main()
{
 fun();
 fun();
 return 0;

}

4register变量

如果有一些变量使用频繁,则为存取变量的值少花些时间,可以将该局部变量的值放在CPU的寄存器中,需要时直接从寄存器取出参加运算,不必去内存中去存取。由于寄存器的存取速度远远高于内存的存取速度,因此这样做可以提高执行效率。这种变量叫做“寄存器变量”,用register作声明。

说明:

1)只有局部自动变量和形式参数可以作为寄存器变量,其他(如全局变量)不行。

2)一个计算机系统中的寄存器数目是有限的,不能定义任意多个寄存器变量。

3)局部静态变量不能定义为寄存器变量。

5.用extern声明外部变量

外部变量是在函数的外部定义的,它的作用域为从变量的定义处开始,到本源程序文件的末尾。在此作用域内,全局变量可以为程序中各个函数所引用。编译时将外部变量分配在静态存储区。有时可以用extern来声明外部变量,以扩展外部变量的作用域。

1)在一个文件内声明外部变量

如果外部变量不在文件的开头定义,其有效的作用范围只限定义处到文件终了,如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。

例:

int max(int x,int y)

{

int z;

z=x>y?x:y;

return(z);

}

main()

{

extern A,B;

printf(“%d”,max(A,B));

}

int A=13,B=-8;

extern声明外部变量时,类型名可以写也可以省写。

2.在多文件的程序中声明外部变量

如果一个程序包含两个文件,在两个文件中都要用到同一个外部变量,不能分别在两个文件中各自定义一个外部变量,否则在进行程序的连接时会出现“重复定义”的错误。正确的做法是:在任一个文件中定义外部变量,而在另一个文件用extern对此变量进行“外部变量声明”。在编译和连接时,系统会由此知道此变量是一个已在别处定义的外部变量,并将在另一个文件中定义的该变量的作用域扩展到本文件中,在本文件中可以合法地引用该外部变量。

例:

文件file1.c中的内容为:

int A;

main()

{

int power(int);

int b=3,c,d,m;

printf(“enter the numbe a and its power m:/n”);

scanf(“%d,%d”,&A,&m);

c=A*b;

printf(“%d*%d=%d/n”,A,b,c);

d=power(m);

printf(“%d**%d=%d”,A,m,d);

}

文件file2.c中的内容为:

extern A;

power(int n)

{

int i,y=1;

for(i=1;i<=n;i++)

     y*=A;

return(y);

}

extern既可以用来扩展外部变量在本文件中的作用域,又可以使外部变量的作用域从一个文件扩展到程序中的其他文件,那么系统怎么区别处理呢?实际上,在编译时遇到extern时,先在本文件中找外部变量的定义,如果找到,就在本文件中扩展作用域。如果找不到,就在连接时从其他文件中找外部变量的定义,如果找到,就将作用域扩展到本文件。如果找不到,就按出错处理。

 

 

来自: http://hi.baidu.com/shuiguoshala/blog/item/c793d5d3c983d6dfa9ec9a9f.html

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值