C++学习笔记关于const int* int const * int* const

Posted 今日长缨在手,何时缚住苍龙?

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++学习笔记关于const int* int const * int* const相关的知识,希望对你有一定的参考价值。

const int*、int const*、 int* const的关键点在于const 与* 的位置,而const 与类型 int的位置无关,可以随意调换,属于个人代码风格,不过建议写成 const int *,方便 直观。
const int*与 int * const 的区别在于 const 修饰的是int* 还是 变量,其中 const int* a 修饰的是int* ,表示这个指针指向的内存区域是常量,不可以修改值,与 const int a 相同,都是不可以改变内存内的值,int* const a 修饰的是变量a,表示变量a的存储的值(指向内存的地址)不可以改变,但是可以改变指向地址的值。
例如:

int m=5,n=10;//定义了两个变量 m  n 
int* a=&m;//a 是一个指针变量,指向了m的地址,即m存的是5,a存的是m的地址,常规操作中我们可以修改m的值,也可以修改a的值
//如下L:
m=15;//直接修改m的值为15,执行后,m是15,*a也是15;
*a=20;//通过指针a修改m的值,执行后,m是20,*a也是20;
a=&n;//直接修改a的值为n的地址,此时*a是10;

const int* b=&m;//b 是一个指针变量,指向m的地址。


*a=20;//这段代码会报错,因为修饰的是指针,表示指针指向的地址的值不可以改变,与 const int c=5;相同点是都是不能修改c的值,不同点是c的值一直不能改,但*a的值可以通过m=20来改变,执行以后,*a也变成了20。 *a不能改,但m能改


a=&n;//虽然const 约束了指针,但是没有约束指针变量,所以可以修改指针变量的值。即:改变指针变量指向的地址。
int* const b=&m;//b是一个常量地址,指向了m的地址


*b=&n;//这行代码会报错,因为b是一个常量,它的值就是m的地址,不能改变变量b的值。


*b=30;//可以通过*b修改m的值。此时m也是30;

c++学习笔记--复合类型,const。

复习c++,有必要对一些东西做一下笔记,方便以后学习,如有问题,欢迎提出。

首先,最常用两种复合类型应该是引用和指针。

所谓复合类型,是在基本类型基础(如:int)上定义的类型。

引用是c++的一个复合类型,首先,它和指针不同的是它并不是一个对象,仅仅只是另一个对象的别名。而且,引用绑定的东西必须是一个对象,引用不是,所以定义引用的引用是

不合法的。也不能定义字面量的引用。同时,普通引用的绑定对象与引用定义类型必须相同。

如:

int &a=10;//错误的,必能定义字面量
double b = 1.22;
int &c = b;//错误,必须是同一种类型。

虽然,普通的引用不能这么定义。

但是const引用却可以,这意味着,像下面这样的代码是合理的:

const &a=10;
double b = 1.22;
const int &c=b;
const int &d = 2*b;

为什么const可以呢?这样代码在编译过程中是这样的

例如第三个:

int tem = b;
const int &c=tem;

系统生成了临时对象。在c++primer中,作者给了这样一个解释,const的引用时不允许对const所修饰的对象进行改变,这意味着,无法改变const引用所绑定的对象,自然也

无法改变tem,但是普通的引用,我们肯定是希望改变引用所绑定的对象的,不然为什么要用引用,既然如此,如果这个规则在普通引用也试用,那改变的将是临时对象,这肯定是矛盾的。

指针是另外一种符合类型。

指针是对象,这个和引用是不同的,它绑定的是另外一个对象的地址。对未知地址的操作可能造成意想不到的效果。所以在指针并不知道指向哪里是,可以先指向NULL,或者c++新标准的nullptr。NULL是预处理变量,不属于std空间,可以直接用。

看这两种指针定义:int *p[3]和int (*p)[3],有什么不同呢。

int *p[3],强调了p[3]保存的是int *,也就是这是一个保存指针的数组,内存是三个int单元。

int (*p)[3],强调的是p是指针,它指向的是一个大小为三的int数组。这意味着p+1,是下一个大小为三的数组首地址,可以当成一个n行3列的二维数组来用。

const是一个限定符,表示常量。

被const限定的指针和引用,相当于签订了协议,表示这个指针或引用所对应的值将不会改变,然而所对应的值是否是常量并不要求,就好像我只约束我自己,你那边怎么样我不管。

这意味着普通的指针或者引用不能绑定常量地址,而指向的常量指针或引用这可以绑定普通地址。

指向常量的指针:如:const int  *a;指约束指向的地址值应该是常量。

还有一种是 常量指针:int const*a;指约束自己,指针本身是常量。

top-level const(顶层const):本身是const

low-leve const(底层const):指向对象是const

之所以这样分类是,因为,底层const约束自己不改变指向的值,所以在执行拷贝或拷出的时候,它要严格约定双方都是底层,不允许对方改变指向对象的值。

而顶层const则约束的是自己,也就是指针或者别的基本数据类型本身不被改变,这意味着,在拷入和拷出并不需要都是顶层const,因为这样的操作不会改变他自己。

 

以上是关于C++学习笔记关于const int* int const * int* const的主要内容,如果未能解决你的问题,请参考以下文章

C++笔记019:C++中的const修饰的是一个真正的常量

c++关于const char*的问题

C++学习-const

C++笔记--const(1-4)

C++ Primer阅读笔记:基础

C++ Primer阅读笔记:基础