• C语言中const的正确用法


    今天看《Linux内核编程》(Claudia Salzberg Podriguez等著)时,文中(p39)有一个错误,就是关于const的用法。

    原文中举例说明:const int *x中x是一个指向const整数的指针,因此可以修改该指针,不可以修改这个整数。而在int const *x中,x却是一个指向整数的const指针,因而这个整数可以改变,但是指针不可以改变。本来我也对这个不是很懂,于是就写了个测试例子测了一下:

    测试一,const int *x,代码如下:

    1     int b = 1,a=3;
    2     const int *c = &a;
    3     c = &b;
    4     printf("c is %d
    ",*c);

    测试结果:c is 1,即,指针可以修改

    修改下:

    1      int b = 2;
    2     const int *c = &b;
    3     *c = 5;
    4     printf("c is %d
    ",*c);

    测试结果,编译错误(GCC):

    line 3 , error: assignment of read-only location '*c'

    由此证明该书中对于 const int *x的描述是正确的,然而问题在于对 int const *x 的描述:”因而这个整数可以改变,但是指针不可以改变“ 却是错误的。

    测试二:

    1     int g = 22;
    2     int const *d;
    3     d = &g;
    4     int f = 23;
    5     d = &f;
    6     printf("d is %d
    ",*d);

    测试结果 d is 23,这个指针是可以改变的!

    改一下:

    1     int g = 22;
    2     int const *d;
    3     d = &g;
    4     *d = 12;
    5     printf("d is %d
    ",*d);

    测试结果,编译错误(GCC)

    line 4 , error: assignment of read-only location '*d'

    所以,const int *x 和 int const *x是一样的,他们都是一个指向const整数的指针,可以修改该指针,但是不能修改这个整数。

    这篇文章也得出相同结论。

    那么正确的:”指向一个整数的const指针,即整数可变,指针不可变“ 用const应该怎么定义?

    测试三:

    1      int g = 22;
    2     int * const d = &g;
    3     int e = 24;
    4     d = &e;
    5     printf("d is %d
    ",*d);

    结果:编译出错:

    line 4 error: assignment of read-only variable 'd'| 即:不能改变指针d

    改一下:

    1      int g = 22;
    2     int * const d = &g;
    3     *d = 24;
    4     printf("d is %d
    ",*d);

    测试结果:

    d is 24,即可以修改整数。

    所以int * const x 是 指向一个整数的const指针,即整数可变,指针不可变。

    结论:

    所以我们可以简单记下这个规则,const 直接修饰的才是只读的,不可变的,

    对于const int *x 和 int const *x,const直接修饰的应该是”整型“,所以,这个整数不可变,但是这个指针可变。

    对于int * const x,const直接修饰的应该是”指针x“,所以,这个指针不可变,但是这个整数可变。

    /* 全文原创,转载请注明出处,如果有不同看法或者问题欢迎随时评论给我。^_^ */

  • 相关阅读:
    Oracle文本导入器
    MSLocalDB
    使用OLE DB读写Excel
    万恶的hao123
    Php最近1个月总结
    thinkphp 3+ 观后详解 (5)
    thinkphp 3+ 观后详解 (4)
    thinkphp 3+ 观后详解 (3)
    thinkphp 3+ 观后详解 (2)
    thinkphp 3+ 观后详解 (1)
  • 原文地址:https://www.cnblogs.com/iceseal/p/3603430.html
Copyright © 2020-2023  润新知