常量指针、指针常量、指向常量的指针常量

1.常量指针

     ❶全称指向一个常量的指针,核心为指针。即一旦指向一个地址,该地址的值不能通过该指针来修改(但可经由指向的变量间接修改);可以更改该指针的值(更改指针指向的地址)。

     ❷定义 const 在“*”左侧。const int *p    int const *p 

     ❸使用

int a = 5;
const int b = 8;
const int *c = &a; //合法
*c = 6; // 非法。但可间接修改c指向的对象的值:a = 6;
const int *d = &b; // 更改地址,合法

   ❹函数形参为常量指针但可接受非常量字符串。目的在于限制了外部变量在子函数内部被更改。
                   int strcmp(const char *str1, const char *str2);

2.指针常量

     ❶全称指针类型常量(地址不能更改),核心为常量,即值为常量的指针。即一旦指向一个地址,不容许修改指针值(更改指向地址);但可以经过指针更改地址存储的内容。

   ❷定义const 在*右侧 。int *const b。
           注意因为为常量,声明时必须赋给初值,一旦赋值,不可变更。

     ❸使用

char *a = "abcde1234";
char *b = "bcde";
char *const c = &a;
a[0] = 'x'; // 更改内容,合法。
*c[0] = 'x' // 更改内容,合法。


3.指向常量的常量指针

    ❶全称:指针指向存储常量的常年地址。指针指向地址不能更改,地址的存储内容也不能更改

  ❷定义和使用:
      const int a = 25;
      const int * const b = &a;


4.总结 

char *a = "abcde1234";
const char *b = "bcde"; // b是常量指针
char *const c = &a;  // c指针常量
const char *const d = &b; // d是指向常量的指针常量

    ❶ b是指向常量的指针变量,当b指向别的字符串,d仍然指向b初始的字符串。
    ❷ b此处静态编译理解成字符串常量指针,不能通过指针b更改内容。

char a[] = "hello";
char b[] = "world";
const char *p1 = a;
char* const p2 = b;

  对于以上定义 p1++即移动指针合法,但是修改不合法。对于p2, *p2='c'即修改合法,但是移动p2不合法。



本文参考:

   常量指针与指针常量的区别(转帖)


原文地址:https://www.cnblogs.com/engineerLF/p/5393073.html