int const *和int * const以及const int * const的区别

本文详细介绍了C++中的const指针用法,包括const int*、int* const和int const* const的区别。通过示例代码展示了它们的特性:const int*指向不可修改的值,int* const指针地址不可变,而int const* const两者均不可变。同时,文章提到了const在类型声明中的螺旋规则,帮助理解复杂指针类型的声明方式。
摘要由CSDN通过智能技术生成

int const *是一个指向常量整数的指针

  • 指向了一个不能被修改的值但是指针指向的地址可以改变

  • const在数据类型的一侧,所以可以放在int的前面const int *,(从c++ prime了解到)

#include <stdio.h>

int main() {
    const int q = 5;
    int const *p = &q;
    // 等价于
    const int *p1 = &q;
    
    const int q2 = 7;
    p = &q2;
    return 0;
}

int * const是一个指向整数的常量指针

  • 指针指向的地址不能被改变,但是地址中的值可以被改变
#include <stdio.h>

int main() {
    const int q = 5;
    int q1 = 5;
    // 错误写法 指向int 而非const int 整形常量
    /*int *const p = &q;*/
    int *const p = &q1;
    *p = 11;

    int q2 = 1;
    // 只读变量p ,p指向的地址不能改变
    //p = &q2;
    return 0;
}

const int * const是一个指向常量整数的常量指针

  • 第一个const可以位于数据类型的任意一侧,所以等效写法int const * const
  • 此指针既不能指向新地址,也不能修改指向的值
#include <stdio.h>

int main() {
    const int q = 5;
    int const * const p = &q;
    // assignment of read-only location ‘*p’
    *p = 10;
    const int q2 = 10;
    // assignment of read-only variable ‘p’
    p = &q2;
    return 0;
}
这2句报错也能很好的告诉我们

 1. 只读变量
 2. 只读位置

螺旋规则解释语法

  • 从变量名开始,然后顺时针移动到下一个指针或类型。重复直到表达式结束 (原文中的图)
  • int const * const va: 变量是-> const -> 是指针 (const pointer)->指向const->int (const int指向常量值)
  • 可看做从右到左

因此

  • int const * 指针指向常量int

  • int * const常量指针指向int

  • int const * const常量指针指向常量int

  • int ** const常量指针指向一个指针且该指针指向一个int

  • int * const *指针 指向 一个常量指针且该指针指向int

  • int const **:指针 指向一个指针且该指针指向常量int, 看做const int **更好理解

  • int * const * const常量指针指向一个常量指针且该指针指向int

     暂时忽略c++中的顶层const和底层const
     没有记错的话: c标准中const是从c++标准中引入的…
    

由于c++引用原因,int &a = b;,导致我经常int* p;这样声明指针

这种声明很容易导致混淆 int* p,q;:
长时间写c++,会习惯性理解成声明了2个指针

但实际上是
 - p是指针
 - q是`int`

尽管这种写法是正确的,

一般都这样写int *p,q;,不容易导致混淆

上面的写法属于习惯问题,编译器并不会报错

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值