搞不懂不吃晚饭

(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指针来改变实参的内容。

最新文章

  1. sshpass----------------sshfs--sftp(sublime)
  2. mysql免安装方法
  3. js小知识归纳(待续)
  4. Python之路,day11-Python基础
  5. require.js 入门学习 (share)
  6. 从IT匹配业务如何走向IT引领业务
  7. Navicat 11使用技巧
  8. 在C#调用C++的DLL简析(一)——生成非托管dll
  9. Item Import: What Does &quot;Sync&quot; Items Do? (Doc ID 417887.1)
  10. Hive的Metastore contains multiple versions
  11. Whitespace character
  12. 图解SSL/TLS协议(转)
  13. 怎么破解Wifi密码
  14. win7下安装sdks
  15. Android 新一代多渠道打包神器
  16. Hystrix-request collapsing(请求合并)
  17. CheckStyle
  18. Ubuntu文件中文乱码
  19. Python2中生成时间戳(Epoch,或Timestamp)的常见误区
  20. [CTSC2010]性能优化

热门文章

  1. linux处理l2tp协议的示意图
  2. 多测师讲解自动化测试_rf运行无日志(解决方法)_高级讲肖sir
  3. 【idea&amp;spring mvc】搭建简易的spring mvc项目(基于maven)!
  4. pytest文档46-关于https请求警告问题(InsecureRequestWarning: Unverified HTTPS request is being made)
  5. centos8使用systemd/systemctl管理系统/服务
  6. Python之for循环和列表
  7. 通过IIS部署,将图片或者视频等文件用http协议网址访问
  8. mysql 必会基础2 distinct
  9. windows上visual studio 2019配置libtorch
  10. LC滤波器简单设计法 - 一文读懂LC滤波器简单设计方法及原理介绍,LC值计算方法