注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

C++中的变量类型  

2011-11-30 22:03:03|  分类: C & C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

1.auto变量

这种是默认的变量,以至于程序员都不使用这个关键字,所以许多人听说auto是C中的关键字的时候心里还在嘀咕:有这个关键字?这种类型的变量在堆栈中分配地址,超出作用域就弹出,传递参数就很简单了。不过这里说“弹出”有点不对,实际上是指向栈顶的指针移动了一位,原来的值还在那里,只是不被标记而已,下面的这段代码揭示了这个现象:

#include <iostream>
using namespace std;
int main()
{
    auto int a=100;
    int* pa=&a;
    cout<<"a="<<a<<"\tAddress:"<<pa<<endl;
    int* pb;
    {
        auto int b=147;
        pb=&b;
        cout<<"b="<<b<<"\tAddress:"<<&b<<endl;
    }//b的作用域结束
    cout<<*pb<<"\tAddress:"<<pb<<endl;
    cin.ignore();
    return 0;
}

程序运行结果如下:

castor_xu - Castor - 趁年轻,多折腾

 如果试图在超出b的作用域外修改访问b的值将不能通过编译。所以这个小程序表明堆栈中分配的变量并不会消失,只是变得不可访问而已。

2.寄存器变量

这种类型的变量用关键字register来标识,用于通知编译器,希望能够在CPU寄存器中处理该变量,而不是在内存中,这样做的好处显然是处理起来效率更高。但是这样会带来不确定性,就是你不知道什么时候寄存器能够使用,试试下面的代码:

#include <iostream>
using namespace std;
int main()
{
    auto int a=100;
    cout<<"a="<<a<<"\tAddress:"<<&a<<endl;
    register int r=200;
    cout<<"r="<<r<<"\tAddress:"<<&r<<endl;
    cin.ignore();
    return 0;
}
理论上来说,这段代码是不应该能通过编译的,因为r为寄存器变量,并没有内存地址,所以&r试图访问该变量的地址会出错,但是有些编译器很宽大,运行会得到和一般的自动变量相同的结果。这是因为,使用寄存器变量只能是用户的美好希望,如果寄存器被占用或者无法处理所请求的类型,编译器还是自动将其转化为自动变量。
3.静态变量
这种变量又要复杂一些,主要是还可以细分为三种链接性,外部链接性、内部链接性和无链接性。
外部链接性:代码块外声明。
内部链接性:代码块外声明,并使用static关键字。
无链接性:代码块内声明,并使用static关键字。
因此,我们说全局变量是具有外部链接性的静态变量。
静态变量在整个程序的执行期间都存在,虽然无链接性的静态变量的作用域只能在它所处的代码块中,但是依旧在内存中的,这一点和自动变量不同。另外,外部链接性的静态变量可以在程序的其他文件中使用,但是内部链接性的静态变量只能是在其所处的文件中可见。
和自动变量不同,未被初始化的静态变量所有位都被设置为0,并且只能使用常量表达式来初始化静态变量。
 
 
  评论这张
 
阅读(1283)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016