const char* p 、char* const p、const (char*) p 理解记忆
来源:互联网 发布:投诉淘宝消协投诉电话 编辑:程序博客网 时间:2024/06/03 15:38
网上查找了很多理解记忆的方式,总结几个对自己理解很有帮助的原则:
1:从右至左理解(应该和c++的语言特性有关)
2:const修饰最近的一个单词,‘*’除外。(还有一种理解const在‘*’左,修饰指针指向内容,在‘*’右,const修饰指针)
3:‘*’的理解(个人,不对再改):‘*’首先是一种描述,描述‘*’作用的变量,它的值是一个地址;然后‘*’有一个动作,将之后的修饰(即‘*’左的修饰)转为描述上述地址所指向的空间。
const char* p:
从右至左:
p是一个变量;
‘*’:①p中记录的是一个地址A②后面的修饰都在修饰这个地址A;
char :地址A存储的是char类型
const:就近修饰 char,地址A存储的是不能改变的char。
改变的理解:地址A的值就是一个char值,且不能改变;指向改地址的p可以再次指向另一个char类型的地址
即可以出现“ p = ……”,但不能出现 “ *p = ……”
补充:指针p指向的值可以是char类型,也可以是const char类型;
const限定的是不能通过“*p = ”去改变这个地址的值,无论这个地址是char还是const char类型;
而若指针p本身指向的或是再次赋值指向的是一个char类型,则这个地址的值可通过其他获取方式赋值改变,而‘*p’获取到的值也会随之改变;
具体的实验代码
#include#include using namespace std;int main(){ int wait; const char i = 'x'; char j = 'l'; const char * p1 = &i; //可以改变地址,但不能通过 *p1= 改变的i值 cout << *p1 << endl; // *p1 : x //*p1= 'a' //错误,不能通过 *p1= 去改变值 p1 = &j;//正确,可以改变指向地址,新指向的是 char,而非 const char; cout << *p1 << endl; // *p1 : l //*p1= 'a' //错误,虽然j是char类型,但是const修饰,仍不能通过 *p1 去改变值 j = 'a';//正确,j并不是const cout << *p1 << endl; // *p1 : a *p1随之改变 cin >> wait; return 0;}
char* const p:
从右至左:
p是一个变量;
const:就近修饰p,p中的值不能改变;
‘*’:①p中不能改变的值是一个地址A②后面的修饰都在修饰这个地址A;
char:地址A中存储char类型值。
改变的理解:p变量的地址值不能改变,指针p只能指向这个地址,这个地址存储的值是可以改变的
即不能出现“p = ……”,但可以出现“*p = ……”
补充:指针p只能指向char类型,不能指向const char类型;
const限定的是p的值不能变,即其指向地址不能变
#include#include using namespace std;int main(){ int wait; char i = 'x'; char j = 'l'; char* const p2 = &i; //不可以改变地址,但可以通过 *p1= 改变i的值 cout << *p2 << endl; // *p1 : x *p2 = 'a'; //正确,能通过 *p1= 去改变值 cout << *p2 <<" "<> wait; return 0;}
const (char*) p:
网络有资料对其理解和 char* const p一样(char *作为一种新的类型);但是个人实验该种声明会直接报错“不允许使用该类型名”。
- const char* p 、char* const p、const (char*) p 理解记忆
- const char*p, char* const p, const char* const p
- 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
- 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
- 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
- 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
- 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
- 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
- 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
- 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
- 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
- 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
- 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
- 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
- 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
- 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
- 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
- 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
- nginx Https配置
- Spring 系列: Spring 框架简介
- 一元数组与二元数组
- python 递归时存储中间变量要用copy 方法,否则出栈就废了
- TSC打印条码
- const char* p 、char* const p、const (char*) p 理解记忆
- linux c语言 main 入参
- 基于蚁群算法求解求解TSP问题(JAVA)
- react 组件添加背景图片
- 掌握的技能
- js中获取map的长度
- pycharm下的多个python版本共存
- angularjs2 一些报错的概览(数据为json格式)
- Springmvc+mybatis+shiro+Dubbo+ZooKeeper+Redis+KafKa j2ee分布式架构核心技术