您的位置:首页 > 其它

const 和一级指针、二级指针、引用的结合使用总结

2017-11-20 12:09 295 查看
#include<iostream>
#include<typeinfo>
using namespace std;
int main(int argc, char* argv[])
{
const int a = 10;   // C++中是真正的常量,C++是强类型语言    但是在C语言中是常变量,可以通过地址修改常变量的值
int b = a;//值传递,正确!a和b没有联系,各自独立的地址,只是值一样
int &c = a;//引用传递,c被更改时a也被更改,不符合a常量的定义。
//=号左边是int*类型,右边是cosnt int* 。错误的赋值操作!
//正确表达为   cosnt int &c = a;

const int a=10;
a = 100;//const变量不可以修改,不能为左值。错误!且不能修改

const int a=10;
int *p = &a;//=号左边是int*,右边是const int *
//从const int * 到 int * 少了const
//一级指针和const结合少了const是错误的类型转换
//因为通过对*p=100赋值可以修改常量a,编译器不予讯所以错误表达式
//正确修改const int *p = &a,用const 修饰*p使得a不可能被修改
int *const p = &a;
错误的表达式,const 只是修饰了指针p,p不可以修改但是*p还是会被修改从而间接修改a

int a = 10;
const int *p = &a;//const int *   <== int*
//cosnt 和一级指针结合,多了const正确表达式
//声明a不可通过*p被修改
int *q = p;   //int *   <=  const int *  cosnt 和一级指针结合,少了const
//错误的表达式,*p是不能被修改的,但是泄漏了地址可以通过*q修改*p的值。不允许

const int a = 10;
int *p = &a;//=号左边int * 右边const int *,一级指针和const结合,少了const会被间接修改a的值
//错误的表达式

int a = 10;//将引用换成指针是:=号左边是const int ** 右边是int **
int *p = &a;//多级指针多了少了const都是错误的表达式
const int *&q = p;//const int **q = &p;

/*
内存上理解就是
const int * &q = p;// const修饰 int ** 不被修改,即变量a的内存不能被修改
//但是*q = 100 却可以去修改a的内存
修改方法1
int a = 10;
int *p = &a;
const int *const&q = p;//此时不能通过*q = 100去修改a的地址。
修改方法2
int a = 10;
const int *p = &a;//不能通过*p去修改a
const int *&q = p;//此时也不能通过*q = 100去修改a的内存。右边也是const int **类型
修改方法3
int a = 10;
int *p = &a;//可以通过*p去修改a
int *&q = p;//也可以通过*q = 100去修改a的内存。两边都是 int **类型

*/

int a = 10;		const int *p = &a;
int *&q = p;   // int**   <=  const int **//二级指针少了const错误
//具体原因同上分析

int a = 10;
int *p = &a;
int *const*q = &p;//一级指针多了const 正确

cin.get();
return 0;
}
/*
总结:::
错误的类型转换
===============================================
const int*   =>  int*

const int**  =>  int**
const int*   =>  int*&

int**        =>  const int**
int*         =>  const int*&

int *const**   =>  int***
int***   =>  int *const**
============================================
const 和多个*结合使用时,查看const右边有几个* ,const 修饰的是const右边的内容。
const只有修饰指针*是才会参与类型

const和*
int * const * 是const 和一级指针结合使用。
在类型转换时,被赋值的变量多了const正确,少了const错误

const和**
const int **  是const 和二级指针结合使用。
在类型转换时,无论多了还是少了COSNT都是错误的。
===============================================
const:
1.const修饰的常量不能作为左值
2.当常量的地址给泄露出去时不能被间接修改常量的值

const出错的原因:
1.你把const值直接改了
2.你把const常量的地址放到了一个普通的指针里面
3.你把const常量的地址放到了一个普通的引用里面
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: