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;将编译报错
}
posted @ 2025-10-19 15:30  焦涛  阅读(1)  评论(0)    收藏  举报