c++中const的详细用法和const char*, char const*, char*const的 ...

文章推薦指數: 80 %
投票人數:10人

const的详细用法和const char*, char const*, char*const的区别,const和define宏定义的区别一个电脑小白的自我成长之路,*_^下面的代码中编译器会报 ... c++中const的详细用法和constchar*,charconst*,char*const的区别,const和define宏定义的区别 口在天上,数在心中 于 2020-09-0215:58:41 发布 1327 收藏 5 文章标签: c++ 编程语言 指针 原文链接:https://blog.csdn.net/sail2011/article/details/9092735?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159903023119195162101294%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=159903023119195162101294&biz_id=0&utm_medium= 版权 const的详细用法和constchar*,charconst*,char*const的区别,const和define宏定义的区别 一个电脑小白的自我成长之路,*_^ 下面的代码中编译器会报一个错误,你知道是哪个语句错了吗? ```cpp typedefchar*pStr; charstring[4]="abc"; constchar*p1=string; constpStrp2=string; p1++; p2++; 是p2++出错了。

这个问题提醒我们:typedef和#define不同,它不是简单的文本替换。

上述代码中constpStrp2并不等于constchar*p2。

constpStrp2和constlongx本质上没有区别,都是对变量进行只读限制,只不过此处变量p2的数据类型是我们自己定义的而不是系统固有类型而已。

因此,constpStrp2的含义是:限定数据类型为char*的变量p2为只读,因此p2++错误。

解释:constchar*p1=string;你可以这样理解:(constchar)*p1=string,p1是一个指针,指向constchar的东西,这个东西就是string(string是一个字符数组的首地址,它的地址声明后肯定是const的,除非该数组销毁),但是p1是一个指针变量,它是可以递增的,即你看到的p1++,它可以完成从数组的来遍历数组的目的。

  而constpStrp2=string;是这样的:由于p2不是指针,const直接修饰到了p2,即现在的p2是常量了(所以p2++就出错了,因为常量不能改),它的类型是pStr(我们自己定义的类型),相当于constintp2,constlongp2等等,const都是直接修饰p2的,只不过int,long是系统类型,而pStr是我们定义的类型。

为什么会出现这种效果了,就是因为typedef,它把char*定义成一个复合的类型,要从整体上来理解语义,而不是字符替换后来理解语义。

const与指针类型声明中const用来修饰一个常量,有如下两种写法,那么,请问,下面分别用const限定不可变的内容是什么?1)、const在前面 constintnValue;//nValue是const   constchar*pContent;//*pContent是const,pContent可变   const(char*)pContent;//pContent是const,*pContent可变   char*constpContent;//pContent是const,*pContent可变   constchar*constpContent;//pContent和*pContent都是const 2)、const在后面,与上面的声明对等 intconstnValue;//nValue是const   charconst*pContent;//*pContent是const,pContent可变   (char*)constpContent;//pContent是const,*pContent可变   char*constpContent;//pContent是const,*pContent可变   charconst*constpContent;//pContent和*pContent都是const 答案与分析:  const和指针一起使用是C语言中一个很常见的困惑之处,在实际开发中,特别是在看别人代码的时候,常常会因为这样而不好判断作者的意图,下面讲一下我的判断原则:  沿着号划一条线,如果const位于的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。

你可以根据这个规则来看上面声明的实际意义,相信定会一目了然。

  另外,需要注意:对于const(char*);因为char*是一个整体,相当于一个类型(如char),因此,这是限定指针是const。

constchar*,charconst*,char*const的区别问题几乎是C++面试中每次都会有的题目。

Bjarne在他的TheC++ProgrammingLanguage里面给出过一个助记的方法:把一个声明从右向左读。

char*constcp;(*读成pointerto)cpisaconstpointertocharconstchar*p;pisapointertoconstchar;charconst*p;同上因为C++里面没有const*的运算符,所以const只能属于前面的类型。

C++标准规定,const关键字放在类型或变量名之前等价的。

constintn=5;//sameasbelow intconstm=10 结论:char*constcp:定义一个指向字符的指针常数,即const指针constchar*p:定义一个指向字符常数的指针charconst*p:等同于constchar*pconstchar**是一个指向指针的指针,那个指针又指向一个字符串常量。

char**也是一个指向指针的指针,那个指针又指向一个字符串变量。

chara[3]=“abc”合法吗?使用它有什么隐患?  答案与分析:  在标准C中这是合法的,但是它的生存环境非常狭小;它定义一个大小为3的数组,初始化为“abc”。

注意,它没有通常的字符串终止符’\0’,因此这个数组只是看起来像C语言中的字符串,实质上却不是,因此所有对字符串进行处理的函数,比如strcpy、printf等,都不能够被使用在这个假字符串上。

const修饰普通变量和指针 const修饰变量,一般有两种写法:const修饰变量,一般有两种写法: constTYPEvalue; TYPEconstvalue; 这两种写法在本质上是一样的。

它的含义是:const修饰的类型为TYPE的变量value是不可变的。

对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即value只不可变。

例如: constintnValue;//nValue是const intconstnValue;//nValue是const 但是对于指针类型的TYPE,不同的写法会有不同情况,例如: A.constchar*pContent; B.char*constpContent; C.charconst*pContent; D.constchar*constpContent; 对于前三种写法,我们可以换个方式,给其加上括号 A.const(char)*pContent; B.(char*)constpContent; C.(char)const*pContent; 这样就一目了然。

根据对于const修饰非指针变量的规则,很明显,A=C. 对于A,C,const修饰的类型为char的变量*pContent为常量,因此,pContent的内容为常量不可变.对于B,其实还有一种写法:const(char*)pContent; 含义为:const修饰的类型为char*的变量pContent为常量,因此,pContent指针本身为常量不可变. 对于D,其实是A和B的混合体,表示指针本身和指针内容两者皆为常量不可变 总结: (1)指针本身是常量不可变 char*)constpContent; const(char*)pContent; (2)指针所指向的内容是常量不可变 const(char)*pContent; (char)const*pContent; (3)两者都不可变 constchar*constpContent; 还有其中区别方法: 沿着*号划一条线, 如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量; 如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。

const修饰函数参数 const修饰函数参数是它最广泛的一种用途,它表示函数体中不能修改参数的值(包括参数本身的值或者参数其中包含的值)。

它可以很好 voidfunction(constintVar);//传递过来的参数在函数内不可以改变(无意义,因为Var本身就是形参) voidfunction(constchar*Var);//参数指针所指内容为常量不可变 voidfunction(char*constVar);//参数指针本身为常量不可变(也无意义,因为char*Var也是形参) 参数为引用,为了增加效率同时防止修改。

修饰引用参数时: voidfunction(constClass&Var);//引用参数在函数内不可以改变 voidfunction(constTYPE&Var);//引用参数在函数内为常量不可变 const修饰函数返回值 const修饰函数返回值其实用的并不是很多,它的含义和const修饰普通变量以及指针的含义基本相同。

(1)constintfun1()这个其实无意义,因为参数返回本身就是赋值。

(2)constint*fun2() 调用时constint*pValue=fun2(); 我们可以把fun2()看作成一个变量,那么就是我们上面所说的1.(1)的写法,即指针内容不可变。

(3)int*constfun3() 调用时int*constpValue=fun2(); 我们可以把fun2()看作成一个变量,那么就是我们上面所说的1.(2)的写法,即指针本身不可变。

const修饰类对象/对象指针/对象引用 const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。

对于对象指针和对象引用也是一样。

const修饰的对象,该对象的任何非const成员函数都不能被调用,因为任何非const成员函数会有修改成员变量的企图。

例如: classAAA { voidfunc1(); voidfunc2()const; } constAAAaObj; aObj.func1();#× aObj.func2();#正确 constAAA*aObj=newAAA(); aObj->func1();#× aObj->func2();#正确 const修饰成员变量 const修饰类的成员函数,表示成员常量,不能被修改,同时它只能在初始化列表中赋值。

classA { … constintnValue;//成员常量不能被修改 … A(intx):nValue(x){};//只能在初始化列表中赋值 } const修饰成员函数 const修饰类的成员函数,则该成员函数不能修改类中任何非const成员函数。

一般写在函数的最后来修饰。

classA { … voidfunction()const;//常成员函数,它不改变对象的成员变量.也不能调用类中任何非const成员函数。

} 对于const类对象/指针/引用,只能调用类的const成员函数,因此,const修饰成员函数的最重要作用就是限制对于const对象的使用。

const常量与define宏定义的区别 (1)编译器处理方式不同 define宏是在预处理阶段展开。

const常量是编译运行阶段使用。

(2)类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开。

const常量有具体的类型,在编译阶段会执行类型检查。

(3)存储方式不同 define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。

const常量会在内存中分配(可以是堆中也可以是栈中)。

口在天上,数在心中 关注 关注 2 点赞 踩 0 评论 5 收藏 扫一扫,分享内容 点击复制链接 constchar*、charconst*、char*const三者的区别 SilentOB的博客 08-09 19万+ C/C++中关于以下三种定义: constchar*ptr; charconst*ptr; char*constptr; 整理三者之间的区别与联系。

一、constchar*ptr; 定义一个指向字符常量的指针,这里,ptr是一个指向char*类型的常量,所以不能用ptr来修改所指向的内容,换句话说,*ptr的值为const,不能修改。

但是ptr... C++constchar*学习 bcbobo21cn的专栏 02-23 159 constchar*ptr; 定义一个指向字符常量的指针;不能用ptr来修改所指向的内容; constchar* 1、字符串相对于指针是常量,但字符串本身不是常量 2、指针能够被重定向 运行如下; 不能用ptr来修改所指向的内容; str1的内容可以改变;ptr指向的内容可以改变;如下图; ... 参与评论 您还未登录,请先 登录 后发表或查看评论 C++错误提示:无法将参数1从constchar[8]转换为char* 热门推荐 geerniya的博客 12-01 1万+ #include<iostream> usingnamespacestd; voidtest(char*p) { cout<<p<<endl; } intmain(void) { test(&am 关于C/C++中constchar*、char*、string之间那点事 lvchang 04-25 376 ​相信很多刚开始学习C/C++的小伙伴经常会遇到constchar*、char*、string之间缠绵的转换关系,甚至有些时候有点迷糊,接下来就开始一起梳理一下... 1.constchar*和string相互转换 //constchar*转string,直接赋值 constchar*pc="itcontainer"; std::stringstr=pc; //st... C++指针之constchar*、charconst*、charconst*const u014627020的博客 11-30 205 C++指针之constchar*、charconst*、charconst*const前言一、指针的数组和数组的指针1、指针的数组T*t[]2、数组的指针T(*t)[]二、使用步骤1.关于const修饰的部分2.constchar*、char*const、charconst*const的区别总结 前言 本文将简单介绍一个C++中指针的constchar*、char*const、charconst*const的区别 一、指针的数组和数组的指针 1、指针的数组T*t[ typedefchar*pStr的问题和constchar*,charconst*,char*const的区别 西雅图搁浅 06-14 4222 下面的代码中编译器会报一个错误,你知道是哪个语句错了吗? typedefchar*pStr; charstring[4]="abc"; constchar*p1=string; constpStrp2=string; p1++; p2++;   是p2++出错了。

这个问题提醒我们:typedef和#define不同,它不是简单的文本替换。

上述代码中c c++constchar*使用 dxm809的博客 03-27 459 #include usingnamespacestd; voidShowMessage(constchar*msg) { cout< usingnamespacestd; intmain() { charstr[]="ILoveChina!";//定义一个字符串数组 const [c++]关于指针的一些问题记录 weixin_30938149的博客 09-20 68 constchar*和char*之间的转换 constchar*是指向常量的指针,而不是指针本身为常量,可以不被初始化.该指针可以指向常量也可以指向变量,只是从该指针的角度而言,它所指向的是常量, 通过该指针不能修改它所指向的数据. 1.constchar是不能直接赋值到char的,这样编译都不能通过,理由:假如可以的话,那么通过char就可以修改cons... Error-无法将参数1从“constchar[4]”转换为“char*”  秀呀秀的博客 02-14 1969 错误如下: 严重性代码说明项目文件行禁止显示状态 错误C2664“String::String(constString&)”:无法将参数1从“constchar[4]”转换为“char*”Project7D:\software\VisualStudio\workspace\Project7\P... C++constchar*a、char*consta、charconst*a、constchar*consta解析 love、reading的博客 08-20 2049 1、constchar*a:声明(*a),(*a)是constchar类型的。

a被一个解引用运算符修饰,故a是个普通的指针,可以修改,但是a所指向的数据(即*a)由于const的修饰而不可通过指针a去修改。

但可以通过其它方式修改a所指向的数据 #include usingnamespacestd; intmain() { charn='... 【C++】constchar*、charconst*、char*const 张林克的博客 07-22 108 pass conststring与conststring&(C++中的引用) yyangzhenjie的博客 06-26 1万+ 引用作为函数参数进行传递时,实质上传递的是实参本身,即传递进来的不是实参的一个拷贝,因此对形参的修改其实是对实参的修改,所以在用引用进行参数传递时,不仅节约时间,而且可以节约空间。

C++随手笔记(四)char字符、字符数组、字符串、字符串指针、string类型、constchar*、charconst*与char*const 最新发布 m0_50990607的博客 03-22 840 1、字符与字符串 字符型常量是用单引号包含起来的一个字符,如‘a’,‘b’; 字符串常量是用一对双引号包含起来的一堆字符,如"a"、”Helloword!"等; ‘a’与“a”的区别: 字符‘a’在内存中占1字节,“a”在内存中占2字节。

“a”的最后一个字符为’\0‘ ’\0‘是一个转义字符,标记字符串内容结束 变量定义与赋值: charc; c='a';//正确 c="a";//错误,不能把一个字符串赋值给一个字符型变量 charcc[]="a";//正确 const*char作函数参数(c++) Laura_Luo的博客 12-17 549 voidemployee::set(intnum,char*c,intmoney,inty,intm,intd) { id=num; name=c; wage=money; years=y; months=m; days=d; } intmain(){ employeeem[5]; em[0].set(1,"wang",5... C++中constchar*,string与char*的转化 xiaoxiaoxiao的博客 10-11 1万+ 1:string转化成constchar* 可以通过调用string类中的c_str函数实现string向constchar*的转换 //string与constchar*转换 strings="string_To_constchar*"; constchar*c_s=s.c_str(); 还可以直接使用string类中的data()函数,直接对constcha “相关推荐”对你有帮助么? 非常没帮助 没帮助 一般 有帮助 非常有帮助 提交 ©️2022CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页 口在天上,数在心中 CSDN认证博客专家 CSDN认证企业博客 码龄2年 暂无认证 33 原创 11万+ 周排名 4万+ 总排名 8万+ 访问 等级 843 积分 36 粉丝 94 获赞 38 评论 502 收藏 私信 关注 热门文章 TensorFlow安装详细教程 9631 C++:实现socket通信(TCP/IP)实例详解(vs2017,vs2019) 7867 memcpy函数 7223 arduino入门(一)arduino下载安装,炒鸡详解 5918 python安装详细教程 5568 分类专栏 yolov5 1篇 arduino 1篇 动态库生成和调用 1篇 目录 1篇 数组 2篇 查询函数 1篇 最新评论 QT调用Python脚本(无参,有参,返回值)和QT5.12安装详细讲解,避坑手册 l小尹: 编译后有信息输出,我加入了main那个函数,信息输出中只有两次hello!hello!,说明defmain没问题,但并没有main中的print(sum(1+2))的输出信息,这是为啥呢 C++:实现socket通信(TCP/IP)实例详解(vs2017,vs2019) m0_68915025: 大佬,我按照你的改了端口号和ip,还是连接不上 QT调用Python脚本(无参,有参,返回值)和QT5.12安装详细讲解,避坑手册 知还: 我一运行直接写程序异常结束,不知道咋回事 TensorFlow安装详细教程 Xing_08: 请问有新的豆瓣源吗,或者怎么找啊 CSharp(C#)读取excel文件,详解 zengyong9039: 你这个要装office才行, 您愿意向朋友推荐“博客详情页”吗? 强烈不推荐 不推荐 一般般 推荐 强烈推荐 提交 最新文章 训练yolov5时,RuntimeError:CUDAoutofmemory. tensorflow2运行时报错AttributeError:‘list‘objecthasnoattribute‘_in_graph_mode‘ 【无标题】安装yoloV5,遇到的问题Cannotuninstall‘PyYAML 2022年2篇 2021年19篇 2020年30篇 目录 目录 分类专栏 yolov5 1篇 arduino 1篇 动态库生成和调用 1篇 目录 1篇 数组 2篇 查询函数 1篇 目录 实付元 使用余额支付 点击重新获取 扫码支付 钱包余额 0 抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。

2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值



請為這篇文章評分?