文档章节

C++中常量指针,指针常量(const 和*)的使用方法和理解方法

阮少爷
 阮少爷
发布于 2016/04/08 00:14
字数 1059
阅读 20
收藏 0
C++

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

当const和指针一起使用的时候,会出现很多复杂的情况,这些复杂的情况大概可以归纳为3种情况:

        (1),指向常量的指针。

        (2),常指针。

        (3),指向常量的常指针。

现在,我来为大家分析这三种使用情况以及用法。


      (1),指向常量的指针是是说一个指向常量的指针变量,例如:

               const char* name = "chen";      //声明指向常量的指针。

         这个语句的含义为:声明一个名字为name的指针变量,它指向一个常量(这个常量为字符型),初始化name为指向字符串“chen”。

         由于使用的const,不允许改变该指针所指向的地址中的常量,因此以下语句是错误的:

              name[3] = 'a';          //报错,指针所指向的地址中的值是常量值,不能改变。

          但是,由于name是一个指向常量的一般指针变量,不是常指针,因此可以改变name所指向的地址。以下操作是正确的:

               name = "abcd";                //合法,可以改变指针所指向的地址。

         该语句付给了name另外一个字符串的首地址,改变了name的值。


        (2),常指针是把指针所指的地址(而不是它所指向的对象)声明为常量,例如:

                char* const name = "chen";             //常指针

         这个语句的含义是:声明一个名字为name的指针变量,该指针是指向字符型数据的常指针,用"chen"的地址初始化该常指针。

        创建一个常指针,就是创建一个不能移动的固定指针,即不能改变它所指向的地址,但是可以改变所指向的地址中的数据。例如:

                name[2] = 'a';           //合法,改变所指向的地址中的值

                name = “abcd”;    //编译不通过,name所指向的地址是不能够被改变的。

        第一个语句是要改变指针所指的地址中的数据,这是合法的,而第二个语句则是要改变该常指针的地址,显然是不合法的。


           (3),指向常量的常指针,是指这个指针本身不能被改变,它所指向的地址中的数据也是不能被改变的。要声明这个指向常量的常指针,二者在声明的时候都要用const,例如:

                  const char* const name = "chen";       //指向常量的常指针。

           这个语句的含义是:声明一个名字为name的指针变量,它是一个指向字符型常量的常指针,用”chen“的地址初始化该指针。因此,对于以下两个表达式都是错误的:

                  name[2] = 'a';            //出错,指针所指向的地址中存的是常量,不能更改

                  name = "zhang";     //出错,该指针所指向的地址不能被更改。



        补充说明:

                     (1),如果用const定义的是一个整型常量,关键字int可以被省略。所以以下的两行定义是完全等价的:

                   const int MAXSIZE = 10;

                   const MAXSIZE = 10;           //省略了关键字int

                      (2),常量一旦被建立,在程序的任何地方都不能更改。

                      (3),与#define定义的常量有所不同,const定义的常量可以有自己的数据类型,这样C++可以进行更加严格的类型检查,具有良好的编译时的检测性。

                       (4),函数的形参也可以用const说明,用于保护形式参数在该函数内部不会被改变,大多数C++编译器能对具有const参数的函数进行更好的代码优化。例如,希望通过函数i_MAX求出整形数组a[200]中的最大值,函数原型是:

                        int i_MAX(const int* ptr);

                       调用时的格式可以是:

                      i_MAX(a);

                       这样做的目的是为了确保原数组中的值不会被破坏,即在函数中,只允许对该数组进行读,不允许进行写。

-------------------------------------------------------------------------------------------                                       以上内容由阮坤原创,若需要转载,请注明出处。


© 著作权归作者所有

阮少爷
粉丝 8
博文 174
码字总数 124470
作品 0
成都
CTO(技术副总裁)
私信 提问
C++ 惯用法: const 常量和字面量

原文:C++ 惯用法: const 常量和字面量 作者:Breaker C++ 中 const 关键字、常量和字面量的惯用法 关键字:const, enum, const_cast, const_iterator, mutable, 左值, 字面量 本质和非本质上...

晨曦之光
2012/05/23
563
0
const static在c c++中的作用

一.C语言中的const const是C语言中保留的一个关键字,它用来限定一个变量是只读的,即不可变的。程序中使用const可以在一定程度上提高程序的健壮性,但是程序中使用过多的const,可能在对代码...

y_x
2011/11/17
521
0
C++关于不能返回局部变量的指针的研究

这里记录一下C++关于不能返回局部变量的指针的研究。关于C++不能返回局部变量的引用很好理解,这里就不探讨了。以下如有不对的,麻烦纠正一下,一起学习进步~。 先总结一下吧: C++Primer中这...

JerryLin123
2018/08/07
19
0
Effective C++学习笔记-01

1.条款03:尽量使用const 1.1 const可以修饰指针,指针所指物,两者或者都不是const对象。注意const的位置,位于号左边的是修饰所指物为常量, 右边是修饰指针 const char* p = greeting //c...

亚历山大痒
2012/12/29
103
0
C++ 备忘录 ( 持续更新中... )

Tip 1: #include包含头文件的问题 新的编译器格式: #include <iostream>using namespace std; 旧的编译器格式: #include <iostream.h> 注:旧的编译器格式中,包含头文件后,不添加 “usi...

谷鹏
2011/04/12
420
1

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周四乱弹 —— 浙江台的电话号码倒是记得挺牢

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :《Out On The Streets》 一直不理解北欧人对重金属和死亡摇滚的热情,听完这首歌好像理解了。#今日歌曲推荐# 《Out On The Stre...

小小编辑
今天
5
0
Leetcode PHP题解--D121 21. Merge Two Sorted Lists

D121 21. Merge Two Sorted Lists 题目链接 21. Merge Two Sorted Lists 题目分析 合并两个有序链表。 思路 逐个遍历两个链表,把小的数字塞入数组里。之后再拼起来。 最终代码 <?php/** *...

skys215
今天
5
0
mars-config 动态配置管理

mars-config 码云地址:https://gitee.com/fashionbrot/mars-config 介绍 spring mvc 、springboot 动态配置系统。http 轮训方式 更新 动态配置 软件架构 软件架构说明 后端使用技术 :sprin...

fashionbrot
今天
14
0
女朋友玩吃鸡手游被开挂老哥骗炮,我见义勇为将骗子绳之以法

大家好,我是乔哥。 晚上10点以后下班后我回到自如出租房里面,开始处理公众号粉丝发来的消息,一条一条处理,突然看到了这么几条消息,吸引了我的眼球: 然后我就和这位女粉丝小红(化名)聊...

gzc426
今天
9
0
两款软件

fadetop保护眼睛软件 Snipaste截图软件

伟大源于勇敢的开始
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部