最近感想

最近看池建强的《MacTalk人生元编程》,对程序员写作挺有感触的。 在以前在豆瓣上看到2.99这个价钱一直想买,支持一下池大。但各种原因吧(主要是看书太少,都只看纯技术类的),还是没买。最近真正玩起了微信,看池大的各种文章,再加上最近看一些其它人文的书,所以这本书就直接收入了。最大的感触就是:以后再也不直接转别人的文章
虽然最近博客的更新也在这种方面有一些改善吧,但看到以前要写出来的知识点,还是想直接转一下,哎。努力做到有自己的想法,让自己写的东西对别人来说有意义

正文

关于static, const, static const修饰符的作用,我想对于老程序员(老一辈的吧)或者C,C++很精通的人,可能这都不算什么。但我这C,C++一直没好好研究明白的,写了几年代码,这个东西也是老忘,真是羞愧啊!
所以特别对这块做一个整理,一方面是自己的理解,另一方面也是集成了自己看过的一些资料。希望能帮助对这方面不太了解的人吧,也希望自己能在这当中有所收获,最坏情况就当是个笔记好了。

内存分区介绍

  • 代码区:存放CPU指令码。
  • 常量区:存放只读常量,该区只读,不可写。
  • 静态区:存放静态变量。该区在程序编译完成后就决定了其大小,程序运行期间该区的大小不会变。该区可读写。
  • 动态区:又分为堆区和栈区,程序运行期间其大小处于动态变化中。处于该区的变量也会时而被创建时而被销毁。

static

一般我们会认为被static修饰的变量是静态变量,如果是在C++中,被static修饰的方法(类中的函数)被会称为静态方法(类方法)。
static修饰的变量存在于内存中的静态区,在main函数执行前被加载。 static修饰的变量, + 局部变量:每次调用的初始值为上一次调用的值,调用结束后存储空间不释放; + 全局变量:如果以文件划分作用域的话,此变量只在当前文件可见;对于static函数也是在当前模块内函数可见.

const

const意为只读(常量) const修饰的变量是只读的,不能被修改。但可通过指针的方式来绕过。这部分平时最容易理解错,也常会出现在面试或笔试题中。我看了很多次相关的东西,还是记不住(太容易混,加上平时用的少),于是写了这样一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
{
    int val = 10;
    int another = 5;
    int * const p = &val;
    const int * q = &another;
    
    *p = 5;       // 上面const修饰指针(p),p不能再指向其它地址
    q = &val;     // 上面const修饰指针指向的值(*q const),*q不能再进行赋值 但下面这样是可以的
    
    another = 6;
    int * q1 = q;
    *q1 = 7;
}

如果对这段代码不明白呢,可以看看参考中的博客。

static const

static const 和 const static 含义相同
二者的结合体:即是只读的,又限制了存储位置与作用域。

const static常量存在于内存的常量区,有操作系统加载程序时,加载到内存的常量区。所以可以对其取址,但是不能对该区的内存进行写操作,因为这个区从操作系统级进行了只读限定,任何对该内存区的写操作会导致程序崩溃。

static const作为预编译声明使用时,相当于C的#define(替换,它们本质不同),但是需要编译器进行类型检查,保证了程序的健壮性。此时其只能用基本数据类型。
static const作为类的常量属性,因为常量区是在程序真正执行代码前进行初始化,所以其也必须是基本数据类型。

static conststatic的区别是,static存在于静态区,该区可以进行写操作,其初始化的值也会存在常量区,程序启动后由操作系统从常量区取值赋值给static变量。

参考:
http://blog.csdn.net/wison_wtj/article/details/23472445
http://zhidao.baidu.com/link?url=Lp5LzAP_sZHsvVeJkkOhKOnoAUbCgzkn4jN5CY7vg44uCvZahsx8mR9Bx2JyxCh1pcFbF4wk5PBPe_rLZOPbXa
http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777416.html