• #const#const int *p 为何可以不初始化


    摘自http://www.myexception.cn/cpp/1900041.html

    const int *p 为什么可以不初始化?
    c++ primer 5th  
    P53 写道:const 对象一旦创建后其值就不能再改变,所以const对象必须初始化。
    但在 P57 中练习2.28的第(e)题为什么判断为合法呢?为什么可以不用初始化呢?

    (e)const int *p;           // legal. a pointer to const int


    ------解决思路----------------------


    const int *p; // p是指针,指向const int类型数据
    int * const p; // p是常指针,指向int类型数据
    const int * const p; // p是常指针,指向const int类型数据


    ------解决思路----------------------
    const 对象一旦创建后其值就不能再改变,所以const对象必须初始化。
    LZ对于这句话中的const对象要弄清楚:
    const int *p中,const对象是*p(即*p的值是只读),而对于此句“const对象必须初始化”,一般用法中我们是要给指针p初始化,而不是给*p初始化。所以在此可以不初始化。即使在声明是进行初始化(const int* p = 0x123456),也是在对指针p初始化,等价于如下一般用法:
    对此的用法一般如下:
    const int *p;
    p = 0x123456;(此时是在给指针p赋值,而不是给*p赋值)

    int* const p中,const对象是p,此时在指针p声明时必须初始化。
    一般用法:
    int* const p = 0x123456;
    ------解决思路----------------------
    遇到const修饰的指针,需要注意有两种可能:
    1、指针变量指向的值无法改变
    2、指针变量本身无法改变
    例如:


    int a = 10;
    const int *p;
    p = &a;
    *p = 3; // 错误,通过此指针改变指向的值
    int b = 5;
    p = &b; // 正确

    int c = 10;
    int * const p = &c;
    *p = 5; // 正确
    int d = 5;
    p = &d; // 错误,指针变量不能改变


    ------解决思路----------------------
    (1) int *p  -- p是个非const指针,指向的对象是int;
    (2) const int *p  --  p是个非const指针,指向的对象是const int;
    (3) int * const p  -- p是个const指针,指向的对象是int;
    (4) const int * const p  -- p是个const指针,指向的对象是const int。
    以上四个都是定义指针p,如果初始化是指初始化指针p,而不是它所指向的对象,由于(3)和(4)中指针p是const的,所以必须初始化。(1)和(2)中的指针p是非const的,可以不初始化。

  • 相关阅读:
    poj 3744 Scout YYF I (矩阵快速幂 优化 概率dp)
    Codeforces Round #272 (Div. 2) D. Dreamoon and Sets (思维 数学 规律)
    Codeforces Round #272 (Div. 2) C. Dreamoon and Sums (数学 思维)
    hdu 5067 Harry And Dig Machine (状态压缩dp)
    hdu 4810 Wall Painting (组合数学+二进制)
    hdu 4856 Tunnels (bfs + 状压dp)
    tc srm 636 div2 500
    poj 2096 Collecting Bugs (概率dp 天数期望)
    ABC182 F Valid payments
    AT2699 [ARC081D] Flip and Rectangles
  • 原文地址:https://www.cnblogs.com/LLbinGG/p/8652362.html
Copyright © 2020-2023  润新知