• const int *p,int *const p区别(转)


    1)先从const int i说起。
    使用const修饰的i我们称之为符号常量。即,i不能在其他地方被重新赋值了。注意:const int i与int const i是等价的,相同的,即const与int的位置无所谓。
    2)const int *p
    看例子:
    int i1=30;
    int i2=40;
    const int *p=&i1;
    p=&i2;  //此处,p可以在任何时候重新赋值一个新的内存地址。
    i2=80;  //这里能用*p=80来代替吗?答案是不能
    printf("%d",*p);  //输出80
    分析:p的值是可以被修改的,即它可以重新指向另一个地址。但是不能通过*p来修改i2的值。
    首先,const修饰的是整个*p(注意,是*p而不是p),所以*p是常量,是不能被赋值的。虽然p所指的i2是变量而不是常量;
    其次,p前并没有用const修饰,所以p是指针变量。能被赋值重新指向另一个内存地址。
    3)int * const p
    int i1=30;
    int i2=40;
    int * const p=&i1;
    //p=&i2;  错误的。p不能再指向另一个新地址了。
    i1=80;  //这里能用*p=80来代替,即可以通过*p修改i1的值。
    printf("%d",*p);
    分析:
    此时p的值不能被赋值修改了,只能永远指向初始化时候的内存地址。相反,可用*p修改i1的值了。
    所以:综上所述,
    指针p因为有了const的修饰,所以为指针常量,即,指针p不能修改了。
    整个*p前面没有const修饰,则*p为变量而不是常量,所以,可改变*p的值。
    如果const修饰在*p前则不能改的是*p,而不是指p;
    如果const是直接写在p前,则p不能改。
    4)补充
    const int i1=40;
    int *p;
    p=&i1;  //提示错误,无法从const int转为int。
    ----------------------------------------
    const int i1=40;
    const int *p;
    p=&i1;  //两个类型相同,可以这样赋值。

    原文地址:http://blog.sina.com.cn/s/blog_6af956630100vpv2.html

    /***************************************************/

    《C语言深度解剖》摘录:

    const int *p; // p 可变,p 指向的对象不可变
    int const *p; // p 可变,p 指向的对象不可变
    int *const p; // p 不可变,p 指向的对象可变
    const int *const p; //指针p 和p 指向的对象都不可变
    记忆和理解的方法:
    先忽略类型名(编译器解析的时候也是忽略类型名),我们看const 离哪个近。“近水楼台先得月”,离谁近就修饰谁。
    const int *p; //const 修饰*p,p 是指针,*p 是指针指向的对象,不可变
    int const *p; //const修饰*p,p 是指针,*p 是指针指向的对象,不可变
    int *const p; //const修饰p,p 不可变,p 指向的对象可变
    const int *const p; //前一个const 修饰*p,后一个const 修饰p,指针p 和p 指向的对象都不可变

  • 相关阅读:
    散列
    Mac os 使用brew install 安装工具时报错 fatal: not in a git directory Error: Command failed with exit 128: git
    java虚拟机内存溢出
    windows 环境变量 立即生效
    phoenix 建表无法映射hbase已有字段的问题解决
    Phoenix
    Elasticsearch搭建集群步骤:
    分层架构的优缺点
    stateTest
    常用命令
  • 原文地址:https://www.cnblogs.com/challenge1230/p/4797058.html
Copyright © 2020-2023  润新知