首先,C和C++在大体结构上不同,却在语法上相同。  所以在使用的时候,我们会时常遇到一些莫名其妙的问题,觉得语法上是正确的,但是编译的时候却出现一个红色的 error! 比如今天我遇到的这个有意思的问题。

1. 今天看到一段代码,觉得很有意思:

 #pragma warning(disable : 4090)

 #include<stdio.h>

 int main(int argv, char args []) {

  const int var = ;
int *p = &var;
*p = ;
printf("%d\n",var);
getchar();
}

答案很定不用说:    1      原因也很简单:  C弱类型语言,C++是强类型语言。  p指针指向了var的地址,并将var的值改变!

但是,我们再看看,这个两个代码:

 #include<iostream>

 using namespace std;

 int main(int args , char  argv[]) {

     const int var = ;
std::cout << "var =" << var << std::endl;
// int * p= &var; --不能转换,会报错!
//可以使用强制转换
int *p = (int *)&var;
*p = ;
std::cout << "*p =" << *p << std::endl;
int num[var]; int i = ;
//初始化
for (auto data : num) {
data =++i;
std::cout<<"num["<<i-<<"] =" << data << std::endl;
}
getchar();
return ;
}

2.  即便你用这个const_cast《》:强制去掉const属性,但是*p=3,这条语句 ,p指向的地址的值任然没有改变!这两个代码的值,都是这个:

 #include<iostream>

 using namespace std;

 int main(int args , char  argv[]) {

     const int var = ;
std::cout << "var =" << var << std::endl;
// int * p= &var; --不能转换,会报错!
//可以使用强制去掉const 属性
int *p = const_cast<int *>(&var);
*p = ;
std::cout << "*p =" << *p << std::endl;
std::cout << "var =" << var << std::endl;
int num[var]; int i = ;
//初始化
for (auto data : num) {
data =++i;
std::cout<<"num["<<i-<<"] =" << data << std::endl;
}
getchar();
return ;
}

结果

为:   我们可以看到,var的值,没有改变!  原因是C++是强类型语言,C++的数据的类型更加严格与苛刻 !

当然对于C++为何会出现指针的值为*p=3而var=10这样的情况,其实,*P所指的常量地址真实的内存已经修改了,但是编译器并没有从内存地址中取值,而是直接从寄存器中取的值,所以var=10依旧表面上依旧没有发生什么改变!

2.   那么,对于指针而言呢? const 用到指针就会发挥大作用,可以设定权限,比如  int const * p   /  const int *p (这两个其实可以看做是同一个类型)均为常量指针, 还有 int * const p 指针常量,还有const int  * const p  ;

根据它们的特性  权限如下:

int  const *p        -----只能读,不能写,既然是指向常量的指针,当然是可以指向其他常量的。

int  *  const p     -----能读也能写,但是既然是指针常量, 当然是不能指向其他地址,无法修改其他地址的值。

  int const * const p    ----能读不能写,而且无法指向其他地址的值。

这样就可以设定权限,对于系统而言,这个是很安全而且很妥当的,还很power ! 当然还可以运用到指针函数什么的 ! 这样const其实作用还是很有用初 的!  特别是用在对安全要求很高的系统,比如银行的系统什么的

最新文章

  1. CSS三个定位——常规、浮动、绝对定位
  2. spring log4j.properties 没有日志的问题
  3. oracle 未找到提供程序。该程序可能未正确安装
  4. Redis学习记录之————微博项目
  5. 理解Session的几种模式
  6. PING的原理以及ICMP协议
  7. MySQL优化技巧之五(mysql查询性能优化)
  8. COJ 0650 绝世难题(一) 可爱的仙人掌
  9. Kafka笔记--监控系统KafkaOffsetMonitor
  10. 表格td标签在不添加多余标签的情况下实现文本内容单行显示,多余部分省略号表示的方法
  11. Mybatis基金会: 经常问的问题FAQ
  12. html获取输入框的值
  13. Win10 教育版
  14. Android破解学习之路(十二)—— GP录像汉化过程及添加布局
  15. 使用工具intellij idea 进行java web开发简介
  16. Hello Json(c#)
  17. 黄聪:visual studio 2017编译运行出现脚本发生错误等问题如何解决?
  18. 二、java三大特性--继承
  19. Spring MVC 学习笔记9 —— 实现简单的用户管理(4)用户登录显示局部异常信息
  20. 手机app有了短信验证码还有没必要有图片验证码?

热门文章

  1. ProgressBar 的使用
  2. 移除virbr0
  3. C#打印条码的几种方式
  4. CUBRID学习笔记 26 数据类型3cubrid教程
  5. Java——Image 图片切割
  6. Python面向对象入门
  7. Windows Internals学习笔记(三)Procdump的使用
  8. iOS - UITouch
  9. iOS - UIWindow
  10. CSU 1802 小X的战斗力【拓扑dp】