您的位置:首页 > 职场人生

PHP程序员的C学习之路3 - 第二章, const关键字和常量

2014-03-25 14:52 274 查看


                       第二章, const关键字和常量

 

 

C语言中的常量跟用const关键字声明的变量比较容易混淆, 使用const关键字声明的变量严格来说不是常量, 只能说是只读变量而已.

 

一般使用const关键字声明一个只读变量可以使用以下的方式:

const type
varname;

或者

type const varname;

 

例如:

const int ivar;

或者

int const ivar;

 

const long lvar;

或者

long const lvar;

 

好了, 当我们声明以了个只读变量后, 试图去修改变量的值会有什么问题呢?

看看以下代码:

#include <stdio.h>

#include <stdlib.h>

 

int main()
{

    const int ivar
= 10;

    ivar = 12;

    return 0;

}

 

然后我们编译这个程序, 出现以下错误:



可以从错误中看出, 我们不能修改一个只读变量.

 

但是为什么说只读变量不是常量呢? 我们上章说过常量, 常量是不能修改的, 如12,
'c'等这些是常量, 我们不能修改他们的值.

但是刚刚我们上面的程序也不能修改他们的值啊? 嗯, 真的不能修改吗? 再看看下面的程序:

#include <stdio.h>

#include <stdlib.h>

 

int main()
{

    const int ivar
= 10;

    int *ip;

 

    printf("ivar:
%d\n", ivar);

 

    ip = &ivar;

    *ip = 12;

 

    printf("ivar:
%d\n", ivar);

 

    return 0;

}

输出:



 

嗯, 我们发现ivar的值已经被修改了, 所以只读变量不是真的只读, 可以同其他的路径去修改他的值.

 

另外再看一个只读变量跟常量的区别, 看代码:

#include <stdio.h>

#include <stdlib.h>

 

#define SIZE1
10

const int SIZE2
= 10;

 

int main()
{

     int array1[SIZE1];

    int array2[SIZE2];

 

    return 0;

}

 

编译结果:



从编译结果中可以看到, 第9行出错了, 错误是数组array2不确定大小. 而使用常量就没有这种错误, 所以可以看出只读变量不是常量.

 

那么只读变量有什么用呢? 一般使用只读变量可以防止自己以外修改变量的值而造成错误. 另外只读变量不是常量, 而是变量, 我们可以通过其他的渠道去修改只读变量的值, 因为只读变量是在编译期间, 编译器做的处理, 主要看看你的代码有没有修改到只读变量的值. 所以只要隐式的修改只读变量的值, 编译器是不会发现的, 就像上面的程序一样.

 

===========================================================================

另外只读变量还有一些高级的用法, 因为现在还没有讲到指针, 所以以下内容可以等到讲完指针再回头看.

 

我们上面介绍了只读变量的声明方式了, 现在重温一下,

const type
varname;

或者

type const varname;

 

那么我们要声明一个int指针类型的只读变量怎么声明呢? 看下面的声明方式:

int * const iptr;//(1)

 

这次我们使用了第二种的声明方式, 如果使用第一种声明方式应该怎样呢? 按声明方式看应该是以下这样:

const int *iptr;//(2)

 

嗯, 这样正确吗? 答案是否定的, 因为*运算比const高级, 所以上面的声明等于下面的声明:

const int (*iptr);//(3)

 

本来我们想声明一个int *类型的只读变量, 现在却变成了声明一个int类型的指针只读变量. 明显不是我们想要的结果.

 

(1)  声明的iptr是不能修改的, 而(2)声明的是(*iptr)不能修改, 那么他们有什么区别?

(1)声明的iptr是指针, 而(2)声明的iptr也是指针, 但是是有区别的, 因为(1)声明的是iptr不能修改, 就是这个指针值不能修改, 而(2)声明的是iptr指向的值不能修改. 这样说可能有点难懂, 看代码:

#include <stdio.h>

#include <stdlib.h>

 

int main()
{

    int * const iptr1;

    const int *iptr2;

 

    iptr1 = 100;

    *iptr2 = 100;

 

    return 0;

}

 

编译信息:



可以看出, 第8和第9行都出错了, 原因是修改了只读变量的值. 那我们现在修改一下程序:

#include <stdio.h>

#include <stdlib.h>

 

int main()
{

    int * const iptr1;

    const int *iptr2;

 

    *iptr1 = 100;

    iptr2 = 100;

 

    return 0;

}

 

嗯, 编译通过了. 从而证实了iptr1和*iptr2不能修改, 但是*iptr1和iptr2可以修改.

 

但是如果我们想用const type
varname;这种形式来声明一个int *类型的只读变量应该怎么做呢? 我们可以使用下面的方式:

const (int *) iptr;

或者

tpyedef int * int_pointer_t;

const int_pointer_t
iptr;

 

还有最后一种情况, 如果我们想声明一个同时不能修改指针和指针指向的值的只读变量应该怎么声明呢? 很简单:

int const * const iptr;

或者

const int * const iptr;

为什么要这样声明, 看看上面的例子再研究就可以了.

 

下章讲的是函数, 请大家继续支持.
 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 php 编程