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 = ⅈ // 报错 不能指向常量,因为它的特点和常量的特点冲突了
指向常量的指针常量
指向常量的指针:可以改变地址指向,不能改变地址中存储的值。
指针常量:不能改变指针指向的地址,可以改变地址中存储的值。
如果想要地址和值都不能改变,那么就可以构建一个指向常量的指针常量,即 *
前后都加上 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 = ⅈ报错 不能指向常量 因为 它的特点和常量的特点冲突了
#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