指针常量&常量指针&指向常量的指针常量
搞不懂不吃晚饭
(1)指针常量
指针常量是一个常量,但是是指针修饰的。
格式:int * const p;
例如
int a, b;
int * const p = &a;//指针常量
//分为以下两种操作
*p = 9;//操作成功
p = &b;//操作错误,指针p将一直指向a,不能再指向b
因为声明了指针常量,p代表一个指针地址,因此指针变量不允许被修改,但是指针所指向的值即*p是可以修改的。如同次指针指向一个地址,该地址不能被修改,但是地址里的内容可以被修改。
(2)常量指针
如果在定义指针变量的时候,数据类型前用const修饰,被定义的指针变量就是指向常量的指针变量,指向常量的指针变量称为常量指针。
格式:const int *p = &a;
例如
int a, b;
const int *p = &a;//常量指针
//那么分为以下两种操作
*p = 9;//操作错误,指针指向的值不能改变
p = &b;//操作成功
因为常量指针的本质是指针,指针所指向的对象的值*p不能更改,但是指针,即p是可以修改的。
小结:
A、关键要看const修饰的是谁
int const 和 const int的写法是一样的
B、指针的话看const离谁近,离谁近就修饰谁
int a = 9;
int b = 5;
const int *p = &a; p = &b;//指针修改后,指针指向的值也修改
常量指针不能用于改变它指向的值;而指针常量在初始化后就不能改变。
常量指针
有时需要将const项目的地址传递给指针,在这种情况下,必须把指针定义为指向const项的指针。
const int SIZE = 6;
const double payRates[SIZE] = {18.55,17,45,12,85,14,97,10,35,18.98};
上述代码中,payRates是一个const double的数组,这意味着数组中每个元素都是一个const double,编译器不会允许程序员编写改变数组内容的代码,如果想要将payRates数组传递到一个指针形参中,那么这个形参必须声明为一个指向const double的指针,定义一个常量指针:const double *rates,rates形参被定义为一个指向const double的指针,const这个单词适用于rates指向的东西,而不是rates本身。
rates是一个指向const的指针,所以编译器不会允许程序员改变rates指向的内容,在将常量的地址传递到指针变量中时,改变量必须已定义为指向常量的指针。如果在rates形参的定义中没有使用const关键字,则会产生编译错误。
指针常量
指向const的指针指向一个常量项目,指针指向的数据不能改变,但是指针本身可以改变,因此是指向常量的指针变量。
而对于指针常量,const指针本身就是常量,一旦指针使用了某个地址进行初始化,那么他就不能指向除此地址之外的任何其他东西。
int value = 22;
int *const ptr = &value;
在该代码中,ptr是用value变量的地址初始化的,因为ptr是一个指针常量,所以如果编写ptr指向其他任何内容的代码,都会导致编译器错误,但是如果使用ptr来改变value的内容,则不会产生错误,因为value不是常量,并且ptr也不是一个指向常量的指针。
指针常量必须使用起始值进行初始化,如果将一个指针常量用作函数形参,则该形参将使用传递进来的实参地址进行初始化,并且在函数执行时不能被修改为指向任何其他地方。以下就是一个试图违反这个规则的实例:
void setToZero(int *const ptr){
ptr = 0;//错误,不能更改ptr的内容
}
这个函数的形参ptr是一个const指针,他不会被编译,因为在函数中不能有改变ptr内容的代码,但是ptr并不指向const,所以可以使用代码来改变ptr指向的数据。以下实例完全可以编译:
void setToZero(int *const ptr){
*ptr = 0;
}
虽然该形参是指针常量,但是程序员可以使用不同的实参多次调用函数,以下的代码可以成功将x、y、z的地址传递给setToZero函数:
int x,y,z;
setToZero(&x);
setToZero(&y);
setToZero(&z);
指向常量的指针常量
int value;
const int *const ptr = &value;
以上代码中,ptr是一个指向const int的const指针。
ptr是用value的地址初始化的,因为ptr是一个指针常量,所以不能编写使ptr指向其他任何东西的代码,又因为ptr是一个常量指针,所以也不能用它来改变value的任何内容。
以下代码显示了一个指向常量的指针常量的另一实例:
void displayValues(const int *const numbers, int size){
for(int count = 0;count < size;count++){
cout << *(numbers + count) << " ";
}
cout << endl;
}
在这段代码中,形参numbers是一个指向const int的const指针,虽然可以使用不同的实参来调用函数,但是函数本身不能改变numbers指针的指向,也不能使用numbers指针来改变实参的内容。
最新文章
- sshpass----------------sshfs--sftp(sublime)
- mysql免安装方法
- js小知识归纳(待续)
- Python之路,day11-Python基础
- require.js 入门学习 (share)
- 从IT匹配业务如何走向IT引领业务
- Navicat 11使用技巧
- 在C#调用C++的DLL简析(一)——生成非托管dll
- Item Import: What Does ";Sync"; Items Do? (Doc ID 417887.1)
- Hive的Metastore contains multiple versions
- Whitespace character
- 图解SSL/TLS协议(转)
- 怎么破解Wifi密码
- win7下安装sdks
- Android 新一代多渠道打包神器
- Hystrix-request collapsing(请求合并)
- CheckStyle
- Ubuntu文件中文乱码
- Python2中生成时间戳(Epoch,或Timestamp)的常见误区
- [CTSC2010]性能优化
热门文章
- linux处理l2tp协议的示意图
- 多测师讲解自动化测试_rf运行无日志(解决方法)_高级讲肖sir
- 【idea&;spring mvc】搭建简易的spring mvc项目(基于maven)!
- pytest文档46-关于https请求警告问题(InsecureRequestWarning: Unverified HTTPS request is being made)
- centos8使用systemd/systemctl管理系统/服务
- Python之for循环和列表
- 通过IIS部署,将图片或者视频等文件用http协议网址访问
- mysql 必会基础2 distinct
- windows上visual studio 2019配置libtorch
- LC滤波器简单设计法 - 一文读懂LC滤波器简单设计方法及原理介绍,LC值计算方法