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

C与C++在const用法上的区别的更多相关文章

  1. Vaadin学习笔记——Page、UI和View在用法上的区别

    前言 在Vaadin技术框架中会出现三种不同的类,用于架构Web应用.它们分别是:Page.UI.View.本文将对这三者从使用角度进行比较,试图分析三者的异同.本文完全原创,我可不是在强调版权,我只 ...

  2. Renderer.materials 和sharedMaterials一些用法上的区别

    Not allowed to access Renderer.materials on prefab object. Use Renderer.sharedMaterials insteadUnity ...

  3. 【转】话说C语言const用法

    原文:话说C语言const用法 const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,意即其所修饰的对象为常量(immutable). 我们来分情况看语法上它该如何被使用. 1.函数体内修 ...

  4. const用法详解(转)

    http://www.cnblogs.com/StudyRush/archive/2010/10/06/1844690.html 面向对象是C++的重要特性. 但是c++在c的基础上新增加的几点优化也 ...

  5. const位置上的不同代表哪些不同的意义

    const位置上的不同代表哪些不同的意义 exern的用法 这个可以引用在程序编译过程中编译进去的常量数据.换句话说正能在.h文件的声明赋值的常量才可以.并且常量的名字不能相同,如果相同会报错. 全局 ...

  6. C++之常指针,指针常量,函数指针,const用法总结

    1.const char *p,char const *p,char * const p 对于C++而言,没有const * 修饰符,所以,const只可以修饰类型或者变量名.因而const char ...

  7. c++ const用法小结

    const用法 1,定义全局变量的内存分配问题 #define  Pi_1  3.14       //使用#define宏 const double Pi_2 = 3.14    //使用const ...

  8. const用法

    一.const作用 二.const用法 1.修饰一般常量   修饰符const可以用在类型说明符前,也可以用在类型说明符后. 例如: ; ; 2.修饰常数组  修饰符const可以用在类型说明符前,也 ...

  9. Mybatis基本用法--上

    Mybatis基本用法--上 本文只是为自己查漏补缺.全面的请看官方文档,支持中英文 原理参考:http://blog.csdn.net/luanlouis/article/details/40422 ...

随机推荐

  1. 键盘unicode值对照表

    A:65 B:66 C:67 D:68 E:69 F:70 G:71 H:72 I:73 J:74 K:75 L:76 M:77 N:78 O:79 P:80 Q:81 R:82 S:83 T:84 ...

  2. Java方法

    所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块. 一般情况下,定义一个方法的语法是: 其中: 1. 访问修饰符:方法允许被访问的权限范围, 可以是 public.protected.p ...

  3. mysql获得自增字段下一个值

    初次研究: 表: sql: show table status from carsale_db LIKE 'tb_car' 结果: 想办法取得这其中的值.... 在Internet上找到这个资料: M ...

  4. DB2常识

    1.DB2组件 appendixa. db2 database product and packaging informatin一节AESE: 高级企业服务器版(Advanced enterprise ...

  5. FileCopy

    /*[入]指的是到内存里,[出]指的是到内存外*/ import java.io.*; public class MyReadFile{ public static void main(String[ ...

  6. iOS 推送消息长度

    iOS最大推送消息长度 官方要求是256个字节 实际测试为1005个字节 在iPhone6上测试 锁屏时收到消息时只显示76个汉字,剩下的被隐藏 程序进入后台时只显示47个汉字,剩下的被隐藏

  7. js 函数-Tom

    函数类型 在ECMAScript 中有三种函数类型:函数声明,函数表达式和函数构造器创建的函数.每一种都有自己的特点. 函数声明 函数声明(缩写为FD)是这样一种函数: 有一个特定的名称 在源码中的位 ...

  8. 查看package编译时的错误信息及重新编译

    开发时,一般都是使用PL/SQL工具进行开发,查看编译错误及重新编译都很简单,但是一般的生产环境是不允许连接外界工具的,只能在命令行中进行重新编译及查看,今天我就遇到了这个问题,现在总结如下: 1.获 ...

  9. proxool在web环境中的使用

    proxool在web环境中的使用 简介 Proxool连接池是sourceforge下的一个开源项目,这个项目提供一个健壮.易用的连接池,最为关键的是这个连接池提供监控的功能,方便易用,便于发现连接 ...

  10. Java 默认/缺省 server 还是 client 模式

    不多说,复制官方文档,适用于 Java 5 6 7 Architecture OS Default client VM if server-class, server VM; otherwise, c ...