const和一二级指针的结合应用
const和一级指针的结合应用
#include <iostream>
#include <typeinfo>
/*
const修饰的量叫常量
普通变量的区别是什么?C++有两点区别?1.编译方式不同 2.不能作为左值了
const修饰的量常出现的错误是:
1.常量不能再作为左值《=直接修改常量的值
2.不能把常量的地址泄露给一个普通的指针或者普通的引用变量《=可以间接修改常量的值
const和一级指针的结合
C++的语言规范:const修饰的是离它最近的类型.有如下4种写法(但是真实情况有两种情况1和3)
1.const int *p=&a;
可以任意指向不同的int类型的内存,但是不能通过指针间接修改指向的内存地的值
=>*p=20
2.int const* p
同const int *p
3.int *const p=&a
这个指针p现在是常量,不能再指向其它内存,但是可以通过指针解引用修改指向的内存值
4.const int *const p=&a
写法1和写法3的结合
const如果右边没有指针*的话,const是不参与类型的
总结const和指针的类型转换公式
int * <= const int * 是错误的!
const int * <= int * 是可以的!
*/
int main()
{
const int a = 10;
/*
下面语句编译报错,担心出现*p=30(解引用进而修改指针的值)
int * <= const int *
*/
//int* p = &a;
const int* p = &a;
std::cout <<"typeid(p).name():"<< typeid(p).name() << std::endl;
//int* p = &a;//编译错误
//int* const p = &a;//编译错误
/*
下面是
int* <=const int*
所以编译会报错
*/
//int* q = p;
int b = 10;
int* p1 = &b;
const int* p2 = &b;//const int * <= int *
int* const p3 = &b;//int* const <= int *
int* p4 = p3;//int* <=int *
int * q1 = nullptr;
int* const q2 = nullptr;
std::cout << "typeid(q1).name():"<<typeid(q1).name() << std::endl;
std::cout <<"typeid(q2).name():" <<typeid(q2).name() << std::endl;
return 0;
}
输出信息如下:
typeid(p).name():int const * __ptr64
typeid(q1).name():int * __ptr64
typeid(q2).name():int * __ptr64
const和二级指针的结合应用
#include <iostream>
#include <typeinfo>
/*
const和二级指针的结合
int ** <= const int ** 是错误的
const int ** <=int ** 是错误的
int ** <= int * const * 是错误的
int* const * <=int ** 是正确的
*/
int main()
{
int a = 10;
int* p = &a;
/*
编译报错: error C2440: “初始化”: 无法从“int **”转换为“const int **”
可以这里理解:
const int * *q=&p
*q等价于p
const int b=20
则可以*q=&b
这样常量地址泄露给了普通的指针
*/
//const int** q = &p;
//解决方案一:
const int* const* q = &p;//编译正常
std::cout << " typeid(q).name():" << typeid(q).name()<<"const int* const* q:" <<q<< std::endl;
//解决方案二:
const int* k= &a;
const int** t = &k;//编译正常
std::cout << " typeid(t).name():" << typeid(t).name()<<"cconst int** t:"<<t << std::endl;
}
输出结果
typeid(q).name():int const * __ptr64 const * __ptr64const int* const* q:0000009D042FF978
typeid(t).name():int const * __ptr64 * __ptr64cconst int** t:0000009D042FF9B8
const和引用
#include <iostream>
#include <typeinfo>
int main()
{
//写一句话,在内存的0x0018ff44处写一个4字节的10
/*
int* p = (int*)0x0018ff44;
或
int*&& p = (int*)0x0018ff44;
后
int *const &p= (int*)0x0018ff44;
*/
int a = 10;
int* p = &a;
int*& q = p;//还原为指针 int **q=&p;
//const int*& q = p;//还原为指针 const**q=&p;将编译报错
}
浙公网安备 33010602011771号