指针和const

c++ pp page 182

将指针和const结合有两种用法:

1.让指针指向一个常量对象,即该指针是一个指向 const 的指针(指向常量的指针),这样可以防止使用该指针来修改其指向的那个值,但是可以改变指针指向的位置

int age = 30;
const int * pt = &age;

上述代码声明了一个指向const int 的指针(const int * 是一种类型,是指向const int 的指针)

在上述代码中,不能使用指针pt来修改age的值,如

*pt = 20; //not allowed
cin>>*pt; //not allowed

但由于变量age并不是一个常量变量,所以仍然可以使用age变量来修改自己的值

age = 10; //allowed

上述代码表明,可以将常规变量的地址赋给 指向const的指针(但仅当只有一层间接关系时,如指针指向基本数据时,才可以将非const地址或指针赋给const指针);

 

我们可以使用const在传递数组参数时保护原数据,即在声明形参时使用关键字const(c++ pp page179)

void show(const int * arr); //or void show(const int arr[])
int main()
{
    int a[3] = {1,2,3};
    show(a);
}

void show(a)
{
    ...       
}

注意上述代码中show()函数进行原型声明时,使用了const关键字,可以防止函数无意中修改数组的内容。

 

要注意,如果是常量变量(const 变量),则只能将其赋给 指向const的指针,即,不能将const的地址赋给常规指针,如下所示:

const float a = 1.63;
float * b = &a; //not allowed

所以,如果有一个由const数据组成的数组,我们就不能将该常量数组的地址赋给非常量指针,这就意味着不能将数组名作为参数传递给使用非常量形参的函数:

const int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31};

int sum(int arr[] , int n); //should have been const int arr[]
...
int j = sum(month,12);//now allowed

 

2.将指针本身声明为常量,这样可以防止改变指针指向的位置

int b = 3;
int * const a = &b;

上述代码中,指针a只能指向b,不能指向其他地方;但可以通过 *a 修改b的值。

 

注意:

int b = 3;
const int * a = &a;//一个指向const int 的指针
int * const a = &a;//一个const指针指向int

 

上一篇:Shiro身份认证学习笔记(一)Shrio体系结构 | 基于官方文档的快速入门 | MDK5 + salt 加密案例 | SpringBoot整合Shiro+SSM+Thymeleaf案例


下一篇:2022-2-20学习内容:队列