C与C++在const用法上的区别

       首先,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其实作用还是很有用初 的!  特别是用在对安全要求很高的系统,比如银行的系统什么的 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SHERlocked93的前端小站

JS 利用高阶函数实现函数缓存(备忘模式)

高阶函数就是那种输入参数里面有一个或者多个函数,输出也是函数的函数,这个在js里面主要是利用闭包实现的,最简单的就是经常看到的在一个函数内部输出另一个函数,比如

4913
来自专栏Java爬坑系列

【Java入门提高篇】Day11 Java代理——JDK动态代理

  今天来看看Java的另一种代理方式——JDK动态代理   我们之前所介绍的代理方式叫静态代理,也就是静态的生成代理对象,而动态代理则是在运行时创建代理对象。...

2037
来自专栏微信公众号:Java团长

触摸Java常量池

java常量池是一个经久不衰的话题,也是面试官的最爱,题目花样百出,这次好好总结一下。

1821
来自专栏玄魂工作室

Hacker基础之Linux篇:基础Linux命令六

以后这个系列的每次就浓缩一下只推送一个命令~ ? sort sort命令是帮我们依据不同的数据类型进行排序,在Linux里非常常用的一个命令 sort命令使用...

3536
来自专栏思考的代码世界

Python编程从入门到实践之函数2|第9天

向函数传递列表很有用,这种列表包含的可能是名字、数字或更复杂的对象(如字典)。将列表传递给函数后,函数就能直接访问其内容。

3697
来自专栏java技术学习之道

一张图搞定Java原型模式

1575
来自专栏xingoo, 一个梦想做发明家的程序员

const指南

基本词义  意思就就是说利用const进行修饰的变量的值在程序的任意位置将不能再被修改,就如同常数一样使用!  使用方法 const int a=1;//这里定...

19410
来自专栏武军超python专栏

2018年7月24日初次接触面向对象

昨天io模块知识的回顾补充: 用json模块可以把程序中的数据转换为字符串类型存储到文件中,但是字符串类型不安全,可以用记事本 直接打开查看里面的的所有内容

1243
来自专栏大数据

在Python中什么时候用Yield什么时候用Return

许多Python开发人员在代码中使用yield,而不考虑他们是否真的需要。这篇文章解释了你什么时候应该使用它。

3460
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-day01-基础题

1. 简述java语言,具有哪些特性? (1).java语言是简单的 java语言是和c++语言类似的,其次java中丢弃了c++中一些难理解的特性,比如运算符...

2784

扫码关注云+社区