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

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

 1 #pragma warning(disable : 4090)
 2
 3 #include<stdio.h>
 4
 5 int main(int argv, char args []) {
 6
 7  const int var = 4;
 8     int *p = &var;
 9     *p = 1;
10     printf("%d\n",var);
11     getchar();
12 }

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

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

 1 #include<iostream>
 2
 3 using namespace std;
 4
 5 int main(int args , char  argv[]) {
 6
 7     const int var = 10;
 8     std::cout << "var =" << var << std::endl;
 9     //    int * p= &var;  --不能转换,会报错!
10     //可以使用强制转换
11     int  *p = (int *)&var;
12     *p = 3;
13     std::cout << "*p =" << *p << std::endl;
14     int num[var];
15
16     int i = 0;
17     //初始化
18     for (auto data : num) {
19         data =++i;
20         std::cout<<"num["<<i-1<<"] =" << data << std::endl;
21     }
22     getchar();
23     return 0;
24 }

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

 1 #include<iostream>
 2
 3 using namespace std;
 4
 5 int main(int args , char  argv[]) {
 6
 7     const int var = 10;
 8     std::cout << "var =" << var << std::endl;
 9     //    int * p= &var;  --不能转换,会报错!
10     //可以使用强制去掉const 属性
11     int  *p = const_cast<int *>(&var);
12     *p = 3;
13     std::cout << "*p =" << *p << std::endl;
14     std::cout << "var =" << var << std::endl;
15     int num[var];
16
17     int i = 0;
18     //初始化
19     for (auto data : num) {
20         data =++i;
21         std::cout<<"num["<<i-1<<"] =" << data << std::endl;
22     }
23     getchar();
24     return 0;
25 }

结果

为:   我们可以看到,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其实作用还是很有用初 的!  特别是用在对安全要求很高的系统,比如银行的系统什么的

C与C++在const用法上的区别相关推荐

  1. C语言typedefine用法介绍,typedef与define在用法上的区别

    简单来讲:#define只是简单的进行了替换,而typedef则是为类型取了个"别名". 1. #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是 ...

  2. 关于SQL数据库中cross join 和inner join用法上的区别?

    使用mysql创建两张表 表a 表b 可以使用下面的脚本创建表,并且添加测试数据: CREATE TABLE `a`  (   `name` varchar(10) CHARACTER SET utf ...

  3. js,jsx,ts和tsx在用法上的区别

    JS 和 JSX 在文件后缀中 .js 表示这是一个 JavaScript 文件 .jsx 表示这是一个 JavaScript XML 文件 JavaScript 是一种直译式脚本语言 JavaScr ...

  4. spark的client模式和cluster模式用法上的区别

    运行模式 启动命令 备注 client模式 spark-shell --master yarn 支持shell,client模式可以在 命令行中省去deploy-mode命令项 cluster模式 s ...

  5. rate和ratio在用法上的区别(转)

    http://blog.sciencenet.cn/blog-656335-992410.html rate 可以翻译为速度或速率,指不同单位之间的关系.比如,某人开车的 rate 是30公里/小时: ...

  6. 加个ing是什么意思_英语中动词ed和ing形式作形容词时用法有啥区别,牢记以下要点!...

    一.动词ed形式 1.意义:动词ed形式作形容词时,表达"某人对--感到怎么样",形容的是人. 2.用法:一般用于sb+be+ 形容词+at/in/about--等固定搭配中. 例 ...

  7. mybatis中的#{}与${}在原理上的区别

    一.MyBatis中${}和#{}的区别 1.1 ${}和#{}演示 数据库数据: dao接口: List<User> findByUsername(String username);Li ...

  8. C语言高频率--typedef和const用法详解

    一.typedef用法详解 C语言允许为一个数据类型起一个新的别名,就像给人起"绰号"一样. 起别名的目的不是为了提高程序运行效率,而是为了编码方便.例如有一个结构体的名字是 st ...

  9. C++const用法总结

    最近在做那个故障树分析和推理诊断项目,其中的推理诊断部分是用c++来写的,毕竟是对火箭的故障分析,甲方突然要求推理结果的精度要很高,让使用贝叶斯网络.找到几种方案,觉得intel的PNL文档比较齐全, ...

最新文章

  1. Silverlight WCF RIA服务(三十四)身份验证、角色、个性化 5
  2. 单元测试以及dagger的使用
  3. volatile的介绍
  4. 关于女人强势表现和强势心理
  5. 易生信Linux培训
  6. 思科命令 service password-encryption
  7. Python《第一次爬虫遭遇反盗链(下)》
  8. 给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。...
  9. 概率论与数理统计【一】- 随机事件与概率(1):古典概型与几何概型
  10. 求最大公因数的两种方法(高效方法)
  11. Android 字体库的使用。引入外部字体
  12. H264编码中Baseline Main High简介
  13. Nachos进程数量限制128、ID号分配以及基于优先级的调度算法详解
  14. 海数所观点:618电商直播狂欢下 为何商家却频频亏损
  15. 山东计算机专业民办大学排名,2020年山东最好的民办大学排名
  16. winform中更新UI控件的方案介绍
  17. iOS 之 安装pods 项目配置 及删除项目中的pods
  18. 北斗三号频点_北斗第三代RNSS多频点接收模块的制造方法
  19. 如何到达梦想的彼岸?
  20. 在金融行业做数据产品经理是什么体验

热门文章

  1. C语言 | 函数指针、指针函数、数组指针、指针数组
  2. 基于Javaweb的订餐管理系统的介绍和分析
  3. 版本控制:SVN和GIT的一些使用感受
  4. php简单实例,php实现推荐功能的简单实例
  5. 矢量合成和分解的法则_重点解析丨抛体运动 之 运动的合成与分解
  6. Java基础day10
  7. 【Python】分享几个简单易懂的Python技巧,能够极大的提高工作效率哦!
  8. 黄海广博士的知乎高赞(1000+)文章分享
  9. 革命性提升-宇宙最强的NLP预训练BERT模型(附官方代码)
  10. CVPR2019 | 目标检测新文:Generalized Intersection over Union