指针与 const的爱恨情仇【const int * , int const * ,int *const, const int *const】

const

使用const关键字来修改变量声明和初始化,创建常量的通用格式如下:

const type name = value;
const int Months = 12;

值得注意的是 const int a 和 int const a 是等价的,习惯上把const放在前面

const 与指针

https://www.geeksforgeeks.org/difference-between-const-int-const-int-const-and-int-const/

上图为指针和const结合的常见的几种类型

  • int *p : a pointer to int
  • const int *p / int const *p : a pointer to const int/ int const
  • int *const p : a constant pointer to int
  • const int *const ptr : a constant pointer to const

常量就是在运行中不会被修改的量,那么从不会被修改的角度来看那几种情况呢?

  • 不能利用指针去修改指向的值 但是其本身的值可以改变
  • 不能修改指针的值 ,也就是 指针本身为常量,防止改变指针指向的位置
  • 既不能修改指针本身的值,也不能去利用指针修改指向的对象的值

小结一下 如下图:

另外也可以根据四象限图来记忆:


横坐标: 标识指向的值 纵坐标: 标识指针本身

记忆规则之中文顺序法:

不管怎么样 int * p 三者的顺序是不变的 只不过看 const放在哪个位置
如果要修饰指针 那一定是放在 指针后面的
如果要修饰变量 那么可前可后,一般习惯放在前面

所以值记忆住一个,就很好区分其他的了。那么记忆哪一个呢?
记住: 指针常量 -> 指针本身的值不可以修改 -> 指针就是* 常量就是 const -> 指针常量 *const

记忆规则之英文逆序法:

https://www.geeksforgeeks.org/difference-between-const-int-const-int-const-and-int-const/

从右向左念

所以:

  • const int * p : a pointer to const int 一个指针 指向 const int
  • int *const p : a constant pointer to int 一个指针常量 指向 int
  • const int *const p : a constant pointer to const int

更加复杂:

  • int **const : a constant pointer to pointer to an int
  • int const : a pointer to a constant pointer to an int
  • const int ** : a pointer to a pointer to a const int
  • int *const * const : a const pointer to a const pointer to an int

总结

  • const 若要修饰指针,一定得放在后面 ,即为 *const : a constant pointer 指针常量
  • const 若要修饰变量,可前可后,但是建议放在前面,如const int 一个整形常量
  • int *const p : a const pointer to int 指向整形的 指针常量
  • const int* p : a pointer to const int 指向const int 的 指针 常量指针

参考资料: https://www.geeksforgeeks.org/difference-between-const-int-const-int-const-and-int-const/

你可能感兴趣的:(指针与 const的爱恨情仇【const int * , int const * ,int *const, const int *const】)