const修饰指针和引用的用法【转贴】

***************************************************

更多精彩,欢迎进入:http://shop115376623.taobao.com

***************************************************


const修饰的指针会额外的占内存吗?

仍然是4,不会占额外的内存。如果确定不会修改的话,加上 const 可以防止被误修改,这样可避免一些错误。而且有利于 编译器 帮组优化程序


const修饰指针引用的用法,

对于初学C++的人直是讳莫如深,不知所云.一旦你了解了其用法,一切便不值一哂了.下面我为读者一一释疑: 

   大致说来其可分为三种情况: const修饰指针,const修饰引用,const修饰指针的引用
1.const修饰指针 
   const修饰指针又可分为三种情况: 
     const修饰指针本身 
     const修饰指针所指的变量(或对象) 
     const修饰指针本身和指针所指的变量(或对象) 
(1).const修饰指针本身 
    这种情形下,指针本身为常量,不可改变,任何修改指针本身的行为都是非法的.例如: 
const int a = 1; 
const int b = 2; 
int i = 3; 
int j = 4; 
int* const pi = &i; //ok, pi的类型为int* const , &i的类型为int* const   //演变:int *p    ->   int * constp
int* const pi = &a; //error, pi的类型为int* const, &a的类型为const int* const 
pi = &j; //error, 指针是常量,不可变 
*pi = a; //ok, *pi并没有限定是常量 ,可变 
    由此看出,pi是常量,常量在初始化和赋值时,类型必须严格一致。也就是 
const修饰指针本身时,=号两边的变量类型必须严格一致,否则不能匹配。 
(2).const修饰指针指向的变量(或对象) 
    此种情形下,通过间接引用指针不可改变变量的值,假设指针为p,则*p不可变,下面以例子说明: 
const int *pi = &a; 
//or int const *pi = &a; 
//两者毫无二致,不过BS喜欢前者,这也没什么技术上的优劣之分,也就是说const int与int const可以互换.建议大家熟 
//悉这两种形式,为简洁便,以后统统用前者. 
//ok, const并不修饰指针本身,pi对赋值类型 
//没要求 ,但pi是int*型指针,所以所赋的必须是个地址值。 
const int *pi = &i; //ok ,pi可赋值常量的地址,又可赋变量的地址 
const int *pi1 = &a; 
const int *pi = pi1; //ok 
*pi = j; //error,*pi 不可变,不能更改指针的间接引用形式 
pi = &j; //ok,pi可变 
pi = &b; //ok,pi可变 
pi++; //ok 
--pi; //ok 
     由此可见,pi是变量,可以赋值常量和变量的值,正如一个整型变量可赋整型数和整型变量一样.const修饰的不是指针本身,而是其间接引用,=号两边的类型不必严格匹配,如:const int* pi = &a;中,pi的类型为int*,而&a的类型为const int* const,只要其中含有int* 就可以。又如:const int *pi = &j;中,pi的类型为int*,而&j的类型为int* const,它向pi赋值并无大碍。 
(3)const修饰指针本身指针所指的变量(或对象) 【前面两者的综合】
     设有指针p,此种情形下,p和*p都不可变.举例如下: 
const int* const pi = &a; 
//or int const* const pi = &a; 
//将const pi看作一体,就与(2)所述相同,只是要求pi必须为const,正如上所说,=号两边的类型不必严格匹配,但必须含有int*, &a的类型为const int* const,含有int*, 所以可以赋值。 
const int* const pi = &i; //ok, &i类型为int* const,含有int*, 可赋值。 
const int *pi1 = &j; 
const int *const pi = pi1; //ok,  pi1类型为int* 
pi = &b; //error, pi不可变 
pi = &j; //error, pi不可变 
*pi = b; //error, *pi不可变 
*pi = j; //error, *pi不可变 
pi++; //error ,pi不可变 
++i; //ok, =号右边的变量(或对象)与所修饰的变量无关 
a--; //error, a为const 
     这种情况,跟以上两种情形有联系。对const int* const pi = &a;我们可以这样看:const int*( const pi )= &a;(仅仅是表达需要),将const pi看作一体,就与上述分类(2)符合。只要含有int*便可. 

2.const修饰引用 
    这种情况比较简单,没有象修饰指针那样繁复,因为引用和引用对象是一体的,所以引用被const修饰只有一种类型。 
const修饰引用,引用本身不可变,但引用的变量(或对象)可以改变.例如: 
const int& ri = a; //or int const & ri = a; ok, ri 本身是常量,引用不区分类型 
const int& ri = i; //ok,引用不区分类型    //演变:int & ri = i    ->     constint & ri = i
ri++; //error, ri为常量,不可变 
i++; //ok,=右边的变量与引用无关 
ri=b; //error, ri为常量 
i=j; //ok,=右边的变量与引用无关 
int & const ri = i; //error,不存在这种形式,没有意义 

3.const修饰指针的引用 
    引用只是个别名,这里与修饰指针类似,又分为三种情况: 
(1) 
     先给个例子: 
const int *pi = &a; 
const int *&ri = pi; 
//or int const *&ri = pi; 
    引用是引用对象的别名,正因为如此,ri是pi的别名,所以ri的类型必须与pi完全一致才行。这里pi的类型为int*,ri的类型也为int*,赋值可行。若const int *&ri = &a;正不正确?分析一下就知晓。ri类型为int*,&a的类型则为const int* const不匹配。 
const int *&ri = &i; //error,类型不匹配,一为int*,一为int* const 
ri = &a; //ok 
ri = &i; //ok 
const int *pi1=&a; 
const int *pi2=&i; 
ri = pi1; //ok 
ri = pi2; //ok 
*ri = i; //error 
*ri = a; //error 
     注意这与1-(2)的区别. 
(2) 
     用例子说明: 
int *const &ri = &i; 
    去掉ri左边的&号,则为int *const ri,因为ri是别名,故ri的类型应与赋值的数类型一致,ri类型为int *const,&i为int *const,可以这么做. 
int *const &ri = pi; //error,类型不合,一为int *const ,一为int * 
int *const &ri = &a; //error,类型不合,一为int *const,一为const int* const 
(*ri)++; //ok 
i++; //ok 
ri = &i; //error 
   这种情况下,ri为常量,不可更改. 
(3) 
     用例子说明: 
const int* pi = &j; 
const int* const &ri = pi; //or int const * const &ri = pi;ok 
const int* const &ri = &i; //ok 
     ri是pi的别名,pi的类型应与ri一致。拿掉&,得const int* const ri ,把const  ri看作一体,很容易得出ri的类型信息,就象前面2-(3)所讨论的一样,可以得到赋给ri的只要含有类型int* 即可。pi的类型为int*,&i的类型为int* const ,可以这么做. 
const int * const &ri = &a; //ok 
ri++;  //error 
*ri = 6;  //error 
    言尽于此,希望对初学者有所助益! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

调整linux系统时区

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 好吧,使用tzselect又靠谱些,使用前把/etc/localtime删除了。 执行上前那个告诉我文件重新了,所以就没有搞了转载于:https://www.cnblogs.com/hark0623/p/4807426.html

stm32c语言设计以及注释,13个基于STM32的经典项目设计实例,全套资料~-嵌入式系统-与非网...

STM32单片机现已火遍大江南北,各种教程资料也是遍布各大网站论坛,可谓一抓一大把,但大部分都差不多。今天总结了几篇电路城上关于STM32 的制作,不能说每篇都是经典,但都是在其他地方找不到的,很有学习参考意…

memcpy,strcpy,strncpy

*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com *************************************************** memcpy c和c使用的内存拷贝函数.从源src所指的内存地址的起始位置开始拷贝n个字节…

二维数组联通子数组和最大

题目要求: 返回一个二维整数数组中最大联通子数组的和。输入一个二维整形数组,数组里有正数也有负数。文件输出。思路:和之前的动态规划相识,把二维数组转换为一维数组,先求每一个列的子数组和最大,最后在用正数就加&a…

c语言如何给变量加锁,C语言互斥锁-条件变量实现公共缓存区数据读写

#include char buffer[128];int has_data0;pthread_mutex_t mutex;pthread_cond_t cond;pthread_cond_t cond2;void read_buf(void){do{pthread_mutex_lock(&mutex);//锁定互斥锁if(has_data0){/*阻塞线程,等待另外一个线程发送信号,同时为公共数据区解锁*/pthr…

view-activity跟控件在onkey事件上的传递关系

android 中Activity跟View对于键盘的监听,主要有以下几个方法 //按键按下 public boolean onKeyDown(int keyCode, KeyEvent event) {} //按键弹起 public boolean onKeyUp(int keyCode, KeyEvent event) {} //常按 public boolean onKeyLongPress(int keyCode, Ke…

PMP考试的过与不过

*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com *************************************************** 我在一年多时间里参加了三次PMP考试,前两次都失败,直到第三次才…

JPA一对多循环引用的解决

说是解决,其实不是很完美的解决的,写出来只是想记录一下这个问题或者看一下有没有哪位仁兄会的,能否知道一二。 下面说说出现问题: 问题是这样的,当我查询一个一对多的实体的时候,工具直接就爆了&#xff0…

太原理工大学c语言课程设计报告,[太原理工大学C语言实验报告.doc

[太原理工大学C语言实验报告本科实验报告课程名称: 程序设计技术B实验项目:实验地点: 明向校区软件学院机房专业班级: 学号:学生姓名:指导教师: 呼克佑2014年 12月 日实验名称 实验一 C语言的运…

网页常用动态效果--悬浮广告

关键在于动态获取滚动坐标值 测试滚动事件 $(window).scroll(function(){ console.log($(window).scrolltop()); }) 获取三个高度:窗口高度,盒子高度以及滚动坐标值,将广告盒子设置为绝对定位,当鼠标滚动时,其top值为滚…

打印英文年历C语言函数,C语言打印年历

voidshow_year(int year){inti,j,k,t,n;                           // 用来辅助计数int table[24][21] {0};                     // 年历数组int month_day[12] {31,28,31,30,31,30,31,31,30,31,30,31}; // 每月上限天数i…

ubuntu14.04配置caffe

ubuntu 14.04 64bit 安装 请自行Google安装&#xff0c;并修改源。 cuda 7.5 安装 cuda7.5下载&#xff0c;选择ubuntu 14.04的deb包下载安装一些可能的依赖 sudo apt-get install linux-headers-$(uname -r) build-essential 安装cuda sudo dpkg –i cuda-repo-<distro>…

iOS开发API常用英语名词

iOS开发API常用英语名词 0. indicating 决定 1.in order to 以便 2.rectangle bounds 矩形尺寸 3.applied 应用 4.entirety 全部 5.technique 方法 6.truncating 截短 7.wrapping 换行 8.string 字符串 9.familiar style 简体 10.The styled text 主题样式 11.Constants 常量 …

Win10 IIS本地部署网站运行时图片和样式不正常?

后期会在博客首发更新&#xff1a;http://dnt.dkill.net 异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 启用关闭win功能&#xff0c;开启一下静态内容 收工~

设置IIS会话过期时间

打开默认网站----双击ASP--展开会话属性---更改超时时间-转载于:https://www.cnblogs.com/genesis/p/4816128.html

89c51单片机汇编语言,AT89C2051时钟程序——MCS51单片机汇编程序

;; AT89C2051时钟程序 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;定时器T0、T1溢出周期为50MS&#xff0c;T0为秒计数用&#xff0c; T1为调整时闪烁用&#xff0c;;P3.7为调整按钮&#xff0c;P1口 为字符输出口&#xff0c;采用共阳显示管。;;;;;;;;;;;;;;;;;;;;;;;;;;;;…

c语言结构体指针初始化

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 记得上周在饭桌上和同事讨论C语言的崛起时&#xff0c;讲到了内存管理方面 我说所有指…

WWDC 2013 Session笔记 - iOS7中弹簧式列表的制作

这是我的WWDC2013系列笔记中的一篇&#xff0c;完整的笔记列表请参看这篇总览。本文仅作为个人记录使用&#xff0c;也欢迎在许可协议范围内转载或使用&#xff0c;但是还烦请保留原文链接&#xff0c;谢谢您的理解合作。如果您觉得本站对您能有帮助&#xff0c;您可以使用RSS或…

H5学习之旅-H5列表(8)

列表的基本语法 ol&#xff1a;有序列表 ul&#xff1a;无序列表 li&#xff1a;列表项 dl&#xff1a;列表 dt&#xff1a;列表项 dd&#xff1a;列表描述 常用列表 1.无序列表&#xff1a;使用标签 ul&#xff0c;li 属性&#xff1a;disc&#xff08;默认实心圆&#xff09;…

c语言 文件夹是否纯真,C语言面试题大汇总之华为面试题(转)

1、局部变量能否和全局变量重名&#xff1f;答&#xff1a;能&#xff0c;局部会屏蔽全局。要用全局变量&#xff0c;需要使用 ":: "局部变量可以与全局变量同名&#xff0c;在函数内引用这个变量时&#xff0c;会用到同名的局部变量&#xff0c;而不会用到全局变量。…