一.使用场景
const修饰指针有三种情况:
1.const修饰指针 -- 常量指针
2.const修饰常量 -- 指针常量
3.const即修饰指针,又修饰常量
总结:我的理解:const就是让这个单元格的内容不可以被修改,const右边的那格变量的值不可以被修改。比如:const int *p = &stiA;(这里理解为,p是一个指向int的指针,在别的地方可以写为int* p,更加强调一个整体类型)就是说,这个指针p指向的int值是不可以被修改的)。但是对于 int * const p = &sti2A;来说,p这个指针存的内容是不可以改变的,也就是p指针的指向是不可以修改的。
二.具体情况
2.1const修饰指针--常量指针
const& int *p = &a;
这种情况,指针的指向可以修改,但是指向的值不可以修改。
2.2const修饰常量--指针常量
2.3既修饰常量又修饰指针
三.源代码
#include<iostream>
using namespace std;
int main() {
//const让值不可以被修改
cout << "const让值不可以被修改" << endl;
const int initA = 0;
//initA = 1;
cout << initA << endl;
//通过指针修改a的值
cout << "通过指针修改a的值" << endl;
int a = 1;
int* ap = &a;
cout << "a = " << a << endl;
*ap = 10;
cout << *ap << endl << "a = " << a << endl;
// 使用场景1:指针修饰常量:指针的指向可以修改,但指向的值不可修改。
cout << "使用场景1" << endl;
int stiA = 10;
int stiB = 10;
int stiC = 5;
// 正确写法:使用 const int* 声明指针
const int* p = &stiA; // 此时 *p 是常量(不能通过 p 修改值)
//*p = 9;//通过修改p指针来修改源数据是不被允许的。
stiA = 9;//可以通过stiA修改值,因为这是修改了指针的指向。
cout << *p << endl;
// 允许修改指针的指向(指向其他地址)
p = &stiC; // 正确:指针的指向可以修改
cout << *p << endl; // 输出 5
// 如果尝试通过 p 修改值,会报错:
// *p = 100; // 错误:编译器会提示 "assignment of read-only location"
//使用场景2:const修饰常量--指针常量,指针的指向不可以修改,但是可以通过指针修改值。
cout << "使用场景2" << endl;
int sti2A = 10;
int sti2B = 5;
int sti2C = 1;
int* const p2 = &sti2A;
// 指针的指向是不可以修改的
//p2 = &sti2B;
// 但是指针的值是可以被修改的
*p2 = 6;
cout << *p2 << endl;
//使用场景3:const既修饰指针又修饰常量--无法修改指针的指向也无法修改指针指向的值。
cout << "使用场景3:const既修饰指针又修饰常量" << endl;
int sti3A = 3;
int sti3B = 2;
int sti3C = 1;
const int* const p3 = &sti3A;
// 无法修改指针的指向
p3 = &sti3B;
// 无法修改指针指向的常量的值
*p3 = 10;
cout << *p3 << endl;
return 0;
}