c++中const的详细用法和const char*, char const*, char*const的 ...
文章推薦指數: 80 %
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
a被一个解引用运算符修饰,故a是个普通的指针,可以修改,但是a所指向的数据(即*a)由于const的修饰而不可通过指针a去修改。
但可以通过其它方式修改a所指向的数据
#include
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币套餐、付费专栏及课程。
余额充值
延伸文章資訊
- 1const 放置位置的意義@ 程式手扎:: 隨意窩Xuite日誌
C++中const用法總結 1. const修飾普通變數和指標const修飾變數, ... 對於A,C, const修飾的類型為char的變數*pContent為常量,因此,pContent的內...
- 2const char*, char const*, char*const 的区别 - 菜鸟教程
Bjarne在他的The C++ Programming Language里面给出过一个助记的方法:把一个声明从右向左读。 char * const cp; ( * 读成pointer to )...
- 3【C 語言入門】24.3 - 字串字面常數與const char * - YouTube
- 4const 在C/C++的用法 - Welkin小窩- 痞客邦
const的用法分為以下兩種: 1:在定義變量時使用: 總結:在使用const定義變量時,一定要進行初始化操作,在操作符(*,&)左邊的修飾的是指向的內容, ...
- 5C語言中的const,free用法詳解 - 程式人生
//const用法作為指標,const char* a,表示a是一個指向常量的一個指標,即常量的內容不能改變,但是指標a(a的值並不是a指向的常量)可以改變 // char* ...