C++ supplement 指针进阶及const限定符

在上一节中说到了基本的指针的定义与解析,下面便是升级版,多级指针的理解:

所谓多级指针在于有多重的指针导向,因为指针是一个对象,在内存中会分配空间,所以可以定义一个指针来指向该指针变量,也就是指向指针类型的指针。那么在解析的时候也就需要进行多重解析了,第一重解析即得到一级指针的地址,第二重解析即得到一级指针所指向的内容。如下图所示:

1

另外,正如给一般的变量去别名一样,既然指针也是一种变量,那么也就可以给它取一个别名啦~~只是这个时候一个变量前面就有多个修饰符了,为了方便理解,最简便的方法是从右至左来解读符号,(*&)——改变量是一个引用型,并且是一个指针类型的引用,如下图所示:

2

之前在项目编程中,也经常使用到const限定符来对变量进行限定,经常是在函数参数定义时使用以使得传递到函数的参数在该函数处理中原始性不会被破坏。若定义一个const修饰的变量时需要对其进行初始化,该初始化的值可以是其他的已有初始化的变量,或者其他有实际值的值或表达式,之后该值便不能再被修改。

好了,知道了const的基本用法,下面来说说当有多个文件中共享或者单独定义const变量的方法:

常规地,在每个文件中定义的重名的常量型变量其作用域也只在其所在的文件,但若希望某一个文件中定义的变量在其他文件中也能共享,此时只需在定义时在其前面加上限定词extern关键词,然后在其他文件中声明时也添加上extern即可,此时该文件中的变量可以不用赋初值,用了extern做修饰则说明它的定义在别处。如下图:

3

接下来就来说说常量变量的引用问题,顾名思义,这种引用是给一个常量型的变量取一个别名,但在给其赋值时,常量型的引用类型只能是常量型(const int i=0;const int &r=i ),但是,常量型引用的初始化值可以是非常量型的任意表达式(int  i=0;const int &r=i),只要最终该表达式可以转换成一个确定的值即可。如下图所示:

在这儿说明一下,为什么非const型的引用无法实现const型变量对其赋值。这就要说到引用存在的意义了,引用即别名,也就是通过对该别名值的改变同等于对其绑定值的改变,但是,如果其绑定值为const类型,也就是其值本身就不可变,那么这种非const型的引用也就失去了意义,所以不存在将const型的变量赋值给非const型的引用。

总之,简单来讲,就是等号的左边有const的情况下,右边可以随意;但是当等号的右边是const型时,则等号左边只能是const 型的引用


上面分别说明了指针与const限定符,那么下面来说说两者的结合体吧~~也就是指向常量的指针。

指向常量的指针(const int*r=&p)即该指针所指向的为常量型的变量,但也并非非得是常量不可,也可以是非const型,也就是等号左边有const,但对于等号右边是否为const型并不在意,其强调的是,不能通过该指针对其所指的对象进行值的改变,而对所指对象并无特别的要求。如下图所示:

说完了指针指向const型的变量后,下面来说说const指针,因为指针和引用最大的不同在于指针是对象占用内存空间,而引用不是对象,在内存中是没有单独地址的,所以可以将指针定义成const常量型。与一般的常量型变量一样,在定义时需要赋初值,而且一旦该指针变量所存的地址值确定后则不能再被改变(int i=0;int *const p=&i),如下图所示:

需要注意的是:

也就是const型指针所存的地址值不能被改变,但其所指对象的值是否能被改变则取决于该变量是否为const型。在这儿就牵涉到了顶层const与底层const的概念,所谓顶层与底层,指的是const所在的层次级别,顶层即常见的常量型直接定义变量,底层是针对常量型引用以及指向const类型的指针而言的。如下图所示:

好了,对于const限定符其绕来绕去也就是三种简单情况的组合,

1:变量直接定义成const常量型,并初始化(const int i=1)

2、const与引用的组合:const int &a=i;

3、const与指针的组合:const int *p=&p    int *const p=&p

以上三种即为最基本的const限定符的使用,这些const均为顶层const,其他的更复杂的组合方式即为这三种基本方式的结合,如: const int*&b=p(p也可以不是const类型的),const int * const c=p(p也可以不是const类型的)

那么针对更复杂的组合 ,记住从右往左读各个限定符一层层的理解即可~

下面再来了解一下常量表达式(constexpr):

在这儿值得注意的是,在对指针的修饰中,constexpr不能简单地用const替换,因为constexpr只用来限定指针是常量而对其所指的内容不作限定,如下图:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容