什么叫常量指针呢?常量指针分为哪三种呢?三者之间有什么区别呢?常量指针的使用场景是什么呢?

问题描述:

根据下列三段代码及其结果回答下列问题。

第一段代码

// Created by 黑马程序员.
#include "iostream"
using namespace std;

/*
 * const表示常量(不可变)
 *
 * 1. 指向const(常量)的指针
 * const int * p;
 *
 * 2. const(常量)指针
 * int * const p = 地址;            指针指向不可改,必须初始化
 *
 * 3. 指向const的const指针
 * const int * const p = 地址;      指针指向不可改,必须初始化
 */
int main()
{
    int num1 = 10, num2 = 100;
    // 1. 指向const的指针, 指向可变,数据不可变
    const int * p = &num1;
    cout << "指针p当前指向的数据是:" << *p << endl;
//    *p = 20;
    p = &num2;
    cout << "指针p当前指向的数据是:" << *p << endl;

    return 0;
}

结果:

D:\CLion_code\cmake-build-debug\CLion_code.exe
指针p当前指向的数据是:10
指针p当前指向的数据是:100

Process finished with exit code 0

第二段代码:

// Created by 黑马程序员.
#include "iostream"
using namespace std;

/*
 * const表示常量(不可变)
 *
 * 1. 指向const(常量)的指针
 * const int * p;
 *
 * 2. const(常量)指针
 * int * const p = 地址;            指针指向不可改,必须初始化
 *
 * 3. 指向const的const指针
 * const int * const p = 地址;      指针指向不可改,必须初始化
 */
int main()
{
    int num1 = 10, num2 = 100;


    // 2. const指针,指向不可变,数据可变
    int * const p = &num1;
    cout << "指针p当前指向的数据是:" << *p << endl;
    *p = 20;
    cout << "指针p当前指向的数据是:" << *p << endl;
//    p = &num2;


    return 0;
}
D:\CLion_code\cmake-build-debug\CLion_code.exe
指针p当前指向的数据是:10
指针p当前指向的数据是:20

Process finished with exit code 0

第三段代码:

// Created by 黑马程序员.
#include "iostream"
using namespace std;

/*
 * const表示常量(不可变)
 *
 * 1. 指向const(常量)的指针
 * const int * p;
 *
 * 2. const(常量)指针
 * int * const p = 地址;            指针指向不可改,必须初始化
 *
 * 3. 指向const的const指针
 * const int * const p = 地址;      指针指向不可改,必须初始化
 */
int main()
{
    int num1 = 10, num2 = 100;


    // 3. 指向const的const指针,指向不可变,数据不可变
    const int * const p = &num1;
    cout << "指针p当前指向的数据是:" << *p << endl;

    p = &num2;
    *p = 20;

    return 0;
}
"D:\CLion_2023_3_5\CLion 2023.3.5\bin\cmake\win\x64\bin\cmake.exe" --build D:\CLion_code\cmake-build-debug --target CLion_code -j 14
[1/2] Building CXX object CMakeFiles/CLion_code.dir/main.cpp.obj
FAILED: CMakeFiles/CLion_code.dir/main.cpp.obj 
"D:\CLion_2023_3_5\CLion 2023.3.5\bin\mingw\bin\g++.exe"   -g -fdiagnostics-color=always -MD -MT CMakeFiles/CLion_code.dir/main.cpp.obj -MF CMakeFiles\CLion_code.dir\main.cpp.obj.d -o CMakeFiles/CLion_code.dir/main.cpp.obj -c D:/CLion_code/main.cpp
D:/CLion_code/main.cpp: In function 'int main()':
D:/CLion_code/main.cpp:26:7: error: assignment of read-only variable 'p'
   26 |     p = &num2;
      |     ~~^~~~~~~
D:/CLion_code/main.cpp:27:8: error: assignment of read-only location '*(const int*)p'
   27 |     *p = 20;
      |     ~~~^~~~
ninja: build stopped: subcommand failed.

什么叫常量指针呢?const是C++关键字,被译为常量,const指针即表示常量指针。常量指针分为哪三种呢?指向const的指针、const指针、指向const的const指针。三者之间有什么区别呢?第一、指向constl的指针表示指向区域的数据,是不变的,但可以更换指向。第二、const指针表示指针本身不可更改,但指向的数据可以更改。第三、指向const的const指针指针和指向区域的值,都不可更改。三者的语法结构分别是什么呢?常量指针的使用场景是什么呢?需要常量的同时也需要动态内存分配的场景。因为只有使用指针,方可动态分配内存。

问题解答:

常量指针(const指针)的概念

在C++中,const是一个关键字,用来定义常量。const指针意味着该指针或它指向的数据有某种不可变性。根据指针本身和指针指向的数据的不同不可变性,常量指针可以分为三种类型:

  1. 指向const的指针 (const int *p)

    • 指针指向的数据是常量,不能通过该指针修改数据,但指针本身可以指向其他地址。
    • 语法:const int *p;
    • 解释:*p是常量,p可以改变。
  2. const指针 (int *const p)

    • 指针本身是常量,不能改变指针的指向,但指针指向的数据可以修改。
    • 语法:int *const p = 地址;
    • 解释:p是常量,*p可以改变。
  3. 指向constconst指针 (const int *const p)

    • 指针本身和指针指向的数据都是常量,既不能修改数据,也不能改变指针的指向。
    • 语法:const int *const p = 地址;
    • 解释:p*p都是常量。

示例代码与解释

第一段代码:指向const的指针
int num1 = 10, num2 = 100;
const int * p = &num1;
cout << "指针p当前指向的数据是:" << *p << endl;
// *p = 20; // 不允许通过`p`修改指向的数据
p = &num2; // 可以改变`p`的指向
cout << "指针p当前指向的数据是:" << *p << endl;

输出:

指针p当前指向的数据是:10
指针p当前指向的数据是:100

解释:

  • p最初指向num1,指向的值为10
  • 通过p = &num2;改变指针的指向,使其指向num2,指向的值变为100
  • 不能通过p修改num1num2的值。
第二段代码:const指针
int num1 = 10, num2 = 100;
int * const p = &num1;
cout << "指针p当前指向的数据是:" << *p << endl;
*p = 20; // 可以修改指针指向的数据
cout << "指针p当前指向的数据是:" << *p << endl;
// p = &num2; // 不允许改变指针的指向

输出:

指针p当前指向的数据是:10
指针p当前指向的数据是:20

解释:

  • p是一个const指针,初始化后不能改变指向。
  • 可以通过*p修改p指向的值,从10变为20
  • 不允许将p指向num2
第三段代码:指向constconst指针
int num1 = 10, num2 = 100;
const int * const p = &num1;
cout << "指针p当前指向的数据是:" << *p << endl;

// p = &num2; // 错误:不允许改变指针的指向
// *p = 20;   // 错误:不允许修改指针指向的数据

错误信息:

D:/CLion_code/main.cpp:26:7: error: assignment of read-only variable 'p'
D:/CLion_code/main.cpp:27:8: error: assignment of read-only location '*(const int*)p'

解释:

  • p是一个指向constconst指针,指针本身和指针指向的值都不可更改。
  • 既不能修改p的指向,也不能通过p修改num1的值。

常量指针的使用场景

  • 指向const的指针: 常用于函数参数中,表示函数不会修改传入的数据。例如,当函数接受一个指针参数,并承诺不会修改指向的数据时,可以使用这种指针。

  • const指针: 常用于需要固定某一资源(如动态分配的内存)的场景中,保证指针不会指向其他位置,避免误操作。

  • 指向constconst指针: 当指针指向的内容和指针本身都需要保持不变时使用,例如全局配置参数的存储。

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神笔馬良

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值