Chinaunix首页 | 论坛 | 博客
  • 博客访问: 257705
  • 博文数量: 107
  • 博客积分: 305
  • 博客等级: 二等列兵
  • 技术积分: 417
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-22 09:42
文章分类

全部博文(107)

文章存档

2014年(3)

2013年(41)

2012年(34)

2011年(28)

2008年(1)

分类: C/C++

2011-07-25 19:38:48

  1. int & const b = a;
  1. const int & a = b;
在C 中,对const这个关键字的使用,我一直比较模糊,最近我比较系统的对这个问题进行了学习,专门记录下来。
 
首先,const这个关键字的最基本的功能就是定义(或者声明??,有待考证)一个常量,表明咱们不能对这个量进行更改。但是,在许多不同的场合下,其含义比较微妙,需要特别注意。
 
1.定义一个常量
比如:
  1. const int a = 0;
就定义了一个整数常量,并且,需要注意的是,在定义常量的时候,必须对其进行初始化,不然编译器会报错。其中gcc会说 uninitialized const, 而vc会说, const variable needs a initializer。就是我们自己定义的类变量或者结构体变量或者数组,我们都必须使用相应的初始化机制,对const变量进行初始化。此外,上面的定义常量的方式和下面这种方式完全等同:
  1. int const a = 0;
2.const和指针结合起来
 
对于一个指针变量,有两个内存区域需要我们考虑,第一个就是指针本身,第二个是指针所指向的内存区域。在考虑这两个因素的情况下,我们就能比较好的理解下面的知识点了。
 
a. 常指针:这个就是说指针本身的值不能变。其实,指针值就是一个32位的无符号整数,这个整数值代表一个32为的地址值,用于指向内存地址空间中的另外一个地方,这就是指针的最基本的概念。所以一个常指针只能固定的指向内存地址空间中的某一个地方,但是这个地址中的内容可以改,请看下面的例子:
 
  1. int a = 6;
  2. int c = 7
  3. int * const b = &a;
  4. b = &c; // 这是非法的;
  5. (*b) = c; // 这是合法的
 
b.指向常量的指针:这种指针非常有意思,指针值本身可以改变,但是,我们不能通过指针来更改指针所指向的内存空间中的变量,这种更改包括如下面的代码所示的通过*赋值,调用对象的非const函数等等。
 
  1. int a = 0;
  2. int b = 1;
  3. const int *c = &b;
  4. c = &b; // 这是合法的
  5. (*c) = 5; // 这是非法的
 
需要注意的是,定义这种指针,如下两种方式完全等价(这个东西困惑了好多人,包括我):
  1. int a = 0;
  2. const int * b = &a;
  3. int const *c = &a;
这种类型的指针广泛应用于函数定义中,用于生命一个常指针,可以向使用这个函数的用户保证,用户传入的参数的指针,该函数不会通过这个指针去更改所传入的指针参数所指向的内容。
 
c.对于定义好的一个常量,我们能如何通过指针引用它?
很明显,对于我们已经定义好的一个常量,我们只能通过如上的a这种方式来进行引用,因为常量的内容是不能改的。
 
  1. const
阅读(998) | 评论(0) | 转发(0) |
0

上一篇:进程内存结构实验

下一篇:wget高级用法

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