我们来探讨下:将const 用于指针的一些微妙地方。
- 让指针指向一个常量对象, 这样可以防止使用该指针修改所指向的值,常量指针。
- 指针本身为常量,这样可以防止指针改变指向的位置,指针常量。
我们主要从下面几个方面做总结:
💚💚💚
- 常规地址赋给常规指针
- 常规地址赋给 const指针
- const地址赋给 常规指针(禁止这样做)
- const 地址赋给 const指针
1.常规地址赋给常规指针
#include<iostream>
int main()
{
int age = 10;
int* ptr = &age;
std::cout << "age address: "<< &age;
std::cout << "ptr address: "<< &ptr;
std::cout << "ptr points address: "<< ptr;
std::cout << "ptr points value: "<< *ptr;
}
// 打印结果
age address: 0x61fe1c
ptr address: 0x61fe10
ptr points address: 0x61fe1c
ptr points value: 10
常规地址赋给 常规指针,这个是最基本的,比较简单,这里就不多介绍。
1. 指向常量的指针 pt (常规地址赋给const指针)
#include<iostream>
int age = 20;
// 声明一个常量指针:因此不能使用 pt来修改这个值,换句话说:*ptr的值是常量,不能被修改。
const int* ptr = &age;
*ptr +=1; // Invalid because ptr points to a const int
age = 30; // valide because age is not a const
💚💚💚
- 虽然是 *ptr是一个常量,但是并不意味着指针指向的值就是常量,只是意味着,对于 ptr而言,这个值是常量。
- 但是由于age不是 const ,可以直接通过 age变量来修改 age值。
2. const地址赋给 const指针
#include<iostream>
int main()
{
const int age = 10;
const int* ptr = &age;
}
💚💚💚
针对这种情况:const地址赋给const指针,这样既不能通过 *ptr 来修改,也不能通过 age来修改。
#include<iostream>
int main()
{
const int age = 10;
int* ptr = &age; // Invalid , const 地址禁止赋给 非 const 指针
}
C++ 还有一个规定:
禁止将const地址赋给非 const指针,如果读者非要这样做,就只能通过类型强转转换
这个禁止是基于这个考虑:如果将const的地址赋给非 const指针,那么就会通过 指针来修改变量值,这样就会使得 const 变量很荒谬。