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