19.指针和常量

19.指针-指针和常量


19.1 知识点

常量知识回顾

常量是指在程序执行过程中其值不能被改变的变量,大部分的常量在声明时都必须被初始化。

关键点:

  • 必须初始化
  • 不能被修改
  • const int 位置可以互换
const int i1 = 10;
int const i2 = 20;

指向常量的指针

指向常量的指针,并不是只能指向常量,也可以指向普通变量。这样命名的主要原因是,这种指针不能改变值,类似常量的特点。

测试变量

const int i = 10;
int j = 1;

指向常量的指针,在 * 前面加一个 const

特点: 可以改变指针指向的地址,但是不能改变值(不能直接改变指针指向地址的值)。

const int* p = &j;
cout << p << endl; // 000000E4678FF4E4
// 指向常量的指针不能够改变其中存储的值
//*p = 10; // 报错 不能改变其中存储的值的,即不允许改变 j 存的值
// 但是可以改变该指针的指向
p = &i;
cout << p << endl; // 000000E4678FF4C4

int const* p2 = &i;
cout << p2 << endl; // 000000E4678FF4C4
//*p2 = 11; // 报错 不能改变其中存储的值的,即不允许改变 i 存的值
// 但是可以改变该指针的指向
p2 = &j;
cout << p2 << endl; // 000000E4678FF4E4

指针常量

指针常量,不能指向常量,可以指向普通变量。这样命名的主要原因是,这种指针不能改变指向,但是可以改变指向地址中存储的值。

指针常量,在 * 后加上 const

特点: 不能改变指针指向的地址,但是可以改变值(指针指向地址中存储的值)。

int j2 = 10;
// 指针常量
int* const ptr = &j2;
// 可以改变指针中指向地址中存储的值
*ptr = 20;
cout << j2 << endl; // 20
cout << *ptr << endl; // 20
// 但是不能够再改变该指针的指向了
// ptr = &j; // 报错 不能够再改变该指针的指向了

不能指向常量,因为它的特点和常量的特点冲突了。常量是不能被修改的,但是指针常量又能修改,冲突。

int const ii = 99;
// int* const ptr2 = &ii; // 报错 不能指向常量,因为它的特点和常量的特点冲突了

指向常量的指针常量

指向常量的指针:可以改变地址指向,不能改变地址中存储的值。

指针常量:不能改变指针指向的地址,可以改变地址中存储的值。

如果想要地址和值都不能改变,那么就可以构建一个指向常量的指针常量,即 * 前后都加上 const

测试常量

const int jjj = 10;
int const jjj2 = 20;

指向常量的指针常量:

const int* const ptr3 = &jjj;
// 指向常量的指针常量的另一种写法
int const* const ptr4 = &jjj2;

// 以下报错 不能改变指向的地址
// ptr3 = &jjj2;
// ptr4 = &jjj;

// 以下报错 不能改变指向地址中存储的值
// *ptr3 = 10;
// *ptr4 = 10;

总结

  • 指向常量的指针: const* 前面去添加即可,值不能改,指向可以改。
  • 指针常量: const* 后面去添加即可,值可以改,指向不能改。
  • 指向常量的指针常量: const* 前后都加,值和指向都不能改了。

19.2 知识点代码

Lesson19_指针_指针和常量.cpp

#include <iostream>
using namespace std;
int main()
{
    std::cout << "指针和常量\n";

    #pragma region 常量知识回顾

    //常量是指在程序执行过程中其值不能被改变的变量,大部分的常量在声明时都必须被初始化
    //关键点:
    //1.必须初始化
    //2.不能被修改
    //3.const int位置可以互换
    const int i1 = 10;
    int const i2 = 20;

    #pragma endregion

    #pragma region 知识点一 指向常量的指针

    //注意:
    //指向常量的指针,并不是只能指向常量,也可以指向普通变量
    //这样命名的主要原因是,这种指针不能改变值,类似常量的特点

    //测试变量
    const int i = 10;
    int j = 1;

    //指向常量的指针,在*前面加一个const
    //特点:可以改变指针指向的地址,但是不能改变值(不能直接改变指针指向地址的值)
    const int* p = &j;
    cout << p << endl;//000000E4678FF4E4
    //指向常量的指针 不能够改变其中存储的值的
    //*p = 10;//报错 不能够改变其中存储的值的 即不允许改变j存的值
    //但是可以改变该指针的指向
    p = &i;
    cout << p << endl;//000000E4678FF4C4

    int const* p2 = &i;
    cout << p2 << endl;//000000E4678FF4C4
    //*p2 = 11;//报错 不能够改变其中存储的值的 即不允许改变i存的值
    //但是可以改变该指针的指向
    p2 = &j;
    cout << p2 << endl;//000000E4678FF4E4

    #pragma endregion

    #pragma region 知识点二 指针常量

    //注意:
    //指针常量,不能指向常量,可以指向普通变量
    //这样命名的主要原因是,这种指针不能改变指向,但是可以改变指向地址中存储的值

    //指针常量,在*后加上const
    //特点:不能改变指针指向的地址,但是可以改变值(指针指向地址中存储的值)
    int j2 = 10;
    //指针常量
    int* const ptr = &j2;
    //可以改变指针中指向地址中存储的值
    *ptr = 20;
    cout << j2 << endl;//20
    cout << *ptr << endl;//20
    //但是不能够再改变该指针的指向了
    //ptr = &j;//报错 但是不能够再改变该指针的指向了

    //不能指向常量 因为 它的特点和常量的特点冲突了
    //常量是不能被修改的 但是指针常量又能修改 冲突
    int const ii = 99;
    //int* const ptr2 = &ii;报错 不能指向常量 因为 它的特点和常量的特点冲突了

    #pragma endregion

    #pragma region 知识点三 指向常量的指针常量

    //指向常量的指针:可以改变地址指向,不能改变地址中存储的值
    //指针常量:不能改变指针指向的地址,可以改变地址中存储的值
    //那么,如果想要地址和值都不能改变,那么就可以构建一个指向常量的指针常量
    //即*前后都加上const

    //测试常量
    const int jjj = 10;
    int const jjj2 = 20;

    //指向常量的指针常量
    const int* const ptr3 = &jjj;
    //指向常量的指针常量的另一种写法
    int const* const ptr4 = &jjj2;

    //以下报错 不能改变指向的地址
    //ptr3 = &jjj2;
    //ptr4 = &jjj;

    //以下报错 不能改变指向地址中存储的值
    //*ptr3 = 10;
    //*ptr4 = 10;

    #pragma endregion

    #pragma region 总结

    //指向常量的指针: const在 *前面去添加即可,值不能改,指向可以改
    //指针常量:const在 *后面去添加即可,值可以改,指向不能改
    //指向常量的指针常量:const在 *前后都加,值和指向都不能改了

    #pragma endregion
}

19.3 练习题

如何声明指向常量的指针,它的特点是什么?

在声明指针时,*前加上const关键字;特点是值不能被修改,指向可以被修改。

如何声明指针常量,它的特点是什么?

在声明指针时,*后加上const关键字;特点是值能被修改,指向不能被修改。

如何声明指向常量的指针常量,它的特点是什么?

在声明指针时,*前后都加上const关键字;特点是值和指向都不能被修改。

指向常量的指针,是否可以指向非常量的变量?

可以。

指针常量,是否可以指向const常量?为什么?

不能。因为指针常量的特点是不能改变指向,但是可以修改它指向地址中存储的值,而const常量的特点是不能被修改,这一点上它们是有冲突的,因此编译器不允许这样做。



转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏