查看: 5087|回复: 10

【村长原创】彻底搞懂 int const *pi 和 int *const pi

    [复制链接]
  • TA的每日心情
    开心
    2020-11-23 14:54
  • 签到天数: 19 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2013-6-11 15:37:52 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 明天你好の 于 2013-6-11 16:25 编辑

       普及C语言知识点,慢慢积累,才能成为高手哦,加油!

    1. int const *pi 的语义
        定义一个指向常整形的指针变量pi(整型数是不可修改的,但指针可以修改)。我先来说说 const int *pi 是什么作用 (当然 const int *pi也是一样的)。看下面的例子:
    int i1 = 30;
    int i2 = 40;
    const int *pi = &i1;
    pi = &i2;    /* 注意这里,pi可以在任意时候重新赋值一个新内存地址*/
    i2 = 80;    /* 想想看:这里能用*pi = 80 来代替吗?当然不能!*/
    printf("%d\n", *pi);  /* 输出是 80 */
    看出来了没有啊,pi 的值是可以被修改的。即它可以重新指向另一个地址的,但是,不能通过*pi 来修改 i2 的值。
    2. int * const pi 的语义
    定义一个指向整形的常量指针pi(指针指向的整型数是可以修改的,但指针是不可修改的)。
    int i1 = 30;
    int i2 = 40;
    int *const pi = &i1;
    /* pi = &i2;    注意这里,pi 不能再这样重新赋值了,即不能再指向另一个新地址。*/
    /* 所以我已经注释了它。*/
    i1 = 80; /* 想想看:这里能用 *pi = 80; 来代替吗?可以,这里可以通过*pi 修改 i1 的值。*/
    printf("%d", *pi);  /* 输出是 80 */
    3. 总结
    比较前面的两个例子,我最后总结两句:
        1)  如果 const 修饰在*pi 前,则不能改的是*pi(常量不能修改:*pi=50)。
        2)  如果const 是直接写在pi前,则pi不能改(指针不能改:pi=&i;赋值)。
    请你务必先记住这两点,相信你一定不会再被它们给搞糊了。现在再看这两个声明语句 int const *pi 和 int *const pi 时,呵呵,你会头昏脑胀还是很轻松惬意?

    评分

    参与人数 1声望 +3 与非币 +5 收起 理由
    小菜儿 + 3 + 5 赞一个!

    查看全部评分

    回复

    使用道具 举报

  • TA的每日心情

    2020-9-10 08:39
  • 签到天数: 125 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2013-6-11 16:02:02 | 显示全部楼层
    强烈给楼主推荐一本书叫C专家编程,像这个C中的常见问题好多的!可以学习下!可以用GCC自己运行下感受一下!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-11-23 14:54
  • 签到天数: 19 天

    连续签到: 1 天

    [LV.4]偶尔看看III

     楼主| 发表于 2013-6-11 16:18:46 | 显示全部楼层
    4. 补充:
    情况一:int *pi 指针指向 const int i 常量的情况
    /* begin */
    const int i1 = 40;
    int *pi;
    pi = &i1;  /* 这样可以吗?不行,VC 下是编译错。*/
    /* const int 类型的 i1 的地址是不能赋值给指向 int 类型地址的指针pi的。否则pi 岂不是能修改 i1 的值了吗!*/
    pi = (int *) &i1;   /* 这样可以吗?强制类型转换可是 C 所支持的。*/
    /* VC 下编译通过,但是仍不能通过 *pi = 80 来修改 i1 的值。去试试吧!看看具体的怎样。*/

    情况二:const int *pi 指针指向const int i1 的情况
    /* begin */
    const int i1=40;
    const int * pi;
    pi=&i1;/* 两个类型相同,可以这样赋值。很显然,i1 的值无论是通过pi 还是i1 都不能修改的。 */
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-11-4 08:32
  • 签到天数: 773 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2013-6-11 21:00:33 | 显示全部楼层
    确实有点晕啊。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-12-6 17:33
  • 签到天数: 853 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2013-6-11 23:15:45 | 显示全部楼层
    只会锯板子的,感觉讲的很不错
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-3-23 09:05
  • 签到天数: 518 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-6-13 10:23:52 | 显示全部楼层
    这不就是const的应用嘛。。应该学C或C++ 的都会去了解的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-11-23 14:54
  • 签到天数: 19 天

    连续签到: 1 天

    [LV.4]偶尔看看III

     楼主| 发表于 2013-6-13 11:31:07 | 显示全部楼层
    Lin丶1st.南 发表于 2013-6-13 10:23
    这不就是const的应用嘛。。应该学C或C++ 的都会去了解的

    对,搞懂就行了,呵呵
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-8-15 09:28
  • 签到天数: 222 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2013-6-13 12:30:26 | 显示全部楼层
    多谢村长分享,向村长学习!!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-9-11 15:03
  • 签到天数: 8 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2013-6-21 03:58:42 | 显示全部楼层
    讲的好,补习了一下。谢谢!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-7-23 22:20
  • 签到天数: 96 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2013-6-21 09:52:50 | 显示全部楼层
    学习了,多谢楼主分享
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-25 08:40 , Processed in 0.206685 second(s), 33 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.