问题描述:
根据下列三段代码及其结果回答下列问题。
第一段代码
// 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
指针意味着该指针或它指向的数据有某种不可变性。根据指针本身和指针指向的数据的不同不可变性,常量指针可以分为三种类型:
-
指向
const
的指针 (const int *p
):- 指针指向的数据是常量,不能通过该指针修改数据,但指针本身可以指向其他地址。
- 语法:
const int *p;
- 解释:
*p
是常量,p
可以改变。
-
const
指针 (int *const p
):- 指针本身是常量,不能改变指针的指向,但指针指向的数据可以修改。
- 语法:
int *const p = 地址;
- 解释:
p
是常量,*p
可以改变。
-
指向
const
的const
指针 (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
修改num1
或num2
的值。
第二段代码: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
。
第三段代码:指向const
的const
指针
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
是一个指向const
的const
指针,指针本身和指针指向的值都不可更改。- 既不能修改
p
的指向,也不能通过p
修改num1
的值。
常量指针的使用场景
-
指向
const
的指针: 常用于函数参数中,表示函数不会修改传入的数据。例如,当函数接受一个指针参数,并承诺不会修改指向的数据时,可以使用这种指针。 -
const
指针: 常用于需要固定某一资源(如动态分配的内存)的场景中,保证指针不会指向其他位置,避免误操作。 -
指向
const
的const
指针: 当指针指向的内容和指针本身都需要保持不变时使用,例如全局配置参数的存储。