c++指针常量和常量指针概述

个人理解,欢迎指正

 

这个简单,简单,简单(不要有心里压力:认为很难)

 

本文将会解决: 

  A、变与不变

  B、判断指针常量和常量指针。

  C、常量指针指针常量。本文不涉及。

 

 

1、概述

  A、指针: 说到底,还是地址, 但是这个地址需要用一个变量保存起来,

  B、为什么? 因为地址随机化。每个进程被创建的时的起始地址时不一样,基址不一样(为什么不一样?可以找下相关资料,每台计算机的运行情况不同,那么内存使用也是不同的,这就形成了地址多样化,如果固定进程起始地址,A机器可以运行程序,到了B机器可能就无法了,程序的起始地址在B机器山上被占用。),程序中对应的每个变量的地址也是变化的。  公式: 实际地址 = 基址 + 偏移 。这样的好处真是多多。 

  C、公式中,基址和实际地址是两个变量,实际地址随基址的变化而变化。(扯远了,这就是为什么要用一个变量来保存地址的原因(个人猜想))。所以,咱们常说的指针其实就包含了三部分: 指向的地址  、 变量本身的地址 和  指向地址的值。

  D、实际使用中,我们经常的是指向的地址,很少用到变量本身的地址。 指针变量名就代表指向的地址, 比如   char *parr = "1234";    parr  代表了字符串“1234”的起始地址,而非parr变量本身的地址。 &parr 才表示变量本身的地址。 

 

2、形式

  这里,以int为例。

int a = 1;
int b = 2;

 

  

 

  A、指针常量:  类型  * const 指针变量名。比如:

int * const pp = &a;

 

 

  B、常量指针: const 类型 * 指针变量名。 比如

const int *p = &a;

 

 

  形如上面,如果不写出来,怎么知道哪个是 指针常量  和 常量指针 

 

3、判断(重点)

  细心点就能发现, 这两个名词中的关键字就两个, 指针和常量。 const 就表示的是常量, 理解为地址解析运算符(个人见解),简单点,我们就理解为指针。  

  A、解读顺序, 以指针表达式为例,默认从左到右。

  B、举例说明: cosnt int *p = & a;  首先解读的是 const ,其次才是 * (地址解析运算符)。所以,这是个 常量指针。谁在前,就先读谁。const 在前, 就先读 const, * 在前,就先读 * 。

  C、还不会判断? 找几个例子,多试试就会了。 很简单。 

  

4、定义

常量指针 指向的地址可以变, 但是指向地址的内容不能变
指针常量 指向的地址不能变, 但是指向地址的内容可以变

 

 

 

 

5、变与不变(重点)

  A、这里有一个参考点: 那就是const。

  B、const 的位置决定了什么变,什么不变。 const 后面紧跟的是什么, 变量名 还是 类型

   C、举例A

const int *p = &a;

  这是一个常量指针。 按照const后面紧跟的是什么, 赋值运算符左边的表达式被分为两部分:  const int   和   *p 

  const int : 表示 类型是一个不可变整形。

  *p:表示指向地址的内容。

  连起来就是: 指向地址的内容的类型是一个不可变整形。

   所以,执行 *p = 2; 就会报错

    

  D、举例B:

int * const pp = &a;

  这是一个指针常量,按照 const 后面紧跟的是什么。 赋值运算左边被分为3部分。 int 、*  和  const pp

  int :整形,指向地址的内容的类型

  const pp : pp代表的就是指向的地址, 再加上const, 就是说,指向的地址是一个常量。

  * : 地址解析运算符。

  连起来: 指向的地址是一个常量,指向地址的内容是整形。 

  所以, *pp = 3; 可以修改成功。

 

6、一个例子

  上面的还是太抽象,来个实际的帮助理解。 

  A、定义和声明如下(自己先判断下,哪个是指针常量,哪个是常量指针):

int a = 1;
int b = 2;
const int *p = &a;
int * const pp = &a;

 

 

 

 

 

  B、查看上面的变量的地址和值是多少

cout << "\n\n &a = " << &a << ", a= " << a << endl;
cout << "&b = " << &b << ", b= " << b << "\n\n";
cout << "&p = " << &p << ", p = " << p << ", *p = " << *p << endl;
cout << "&pp = " << &pp << ", pp = " << pp << ", *pp = " << *pp << endl;

 

 

 

 

 

  C、我这里显示的结果:

  D、解读

    上面的代码发现, 指针变量名就是指针指向内容的地址

  

  E、下面尝试修改指针指向的内容。 

cout << "\n\n--下面开始尝试修改值----\n\n";
p = &b; // 常量指针, 指向的地址可以变, 但是指向地址的内容不能变, OK 
cout << "&p = " << &p << ", p = " << p << ", *p = " << *p << endl;
// *p = 2; // 常量指针, 指向的地址可以变, 但是指向地址的内容不能变。error. 
*pp = 3; // 指针常量, 指向的地址不能变, 但是指向地址的内容可以变。
cout << "&pp = " << &pp << ", pp = " << pp << ", *pp = " << *pp << endl;

 

 

 

 

 

 

 

   D、结果:

 

7、源码:

  

int a = 1;
    int b = 2;
    const int *p = &a;
    int * const pp = &a;

    cout << "\n\n&a = " << &a << ", a= " << a << endl;
    cout << "&b = " << &b << ", b= " << b << "\n\n";

    cout << "&p = " << &p << ", p = " << p << ", *p = " << *p << endl;
    cout << "&pp = " << &pp << ", pp = " << pp << ", *pp = " << *pp << endl;

    cout << "\n\n--下面开始尝试修改值----\n\n";
    p = &b;        // 常量指针, 指向的地址可以变, 但是指向地址的内容不能变, OK 
    cout << "&p = " << &p << ", p = " << p << ", *p = " << *p << endl;
    // *p = 2;    // 常量指针, 指向的地址可以变, 但是指向地址的内容不能变。error. 
    *pp = 3;    // 指针常量, 指向的地址不能变, 但是指向地址的内容可以变。
    cout << "&pp = " << &pp << ", pp = " << pp << ", *pp = " << *pp << endl;

 

posted @ 2020-08-16 16:22  mohist  阅读(598)  评论(0编辑  收藏  举报