C与C++在const用法上的区别
首先,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用法上的区别的更多相关文章
- Vaadin学习笔记——Page、UI和View在用法上的区别
前言 在Vaadin技术框架中会出现三种不同的类,用于架构Web应用.它们分别是:Page.UI.View.本文将对这三者从使用角度进行比较,试图分析三者的异同.本文完全原创,我可不是在强调版权,我只 ...
- Renderer.materials 和sharedMaterials一些用法上的区别
Not allowed to access Renderer.materials on prefab object. Use Renderer.sharedMaterials insteadUnity ...
- 【转】话说C语言const用法
原文:话说C语言const用法 const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,意即其所修饰的对象为常量(immutable). 我们来分情况看语法上它该如何被使用. 1.函数体内修 ...
- const用法详解(转)
http://www.cnblogs.com/StudyRush/archive/2010/10/06/1844690.html 面向对象是C++的重要特性. 但是c++在c的基础上新增加的几点优化也 ...
- const位置上的不同代表哪些不同的意义
const位置上的不同代表哪些不同的意义 exern的用法 这个可以引用在程序编译过程中编译进去的常量数据.换句话说正能在.h文件的声明赋值的常量才可以.并且常量的名字不能相同,如果相同会报错. 全局 ...
- C++之常指针,指针常量,函数指针,const用法总结
1.const char *p,char const *p,char * const p 对于C++而言,没有const * 修饰符,所以,const只可以修饰类型或者变量名.因而const char ...
- c++ const用法小结
const用法 1,定义全局变量的内存分配问题 #define Pi_1 3.14 //使用#define宏 const double Pi_2 = 3.14 //使用const ...
- const用法
一.const作用 二.const用法 1.修饰一般常量 修饰符const可以用在类型说明符前,也可以用在类型说明符后. 例如: ; ; 2.修饰常数组 修饰符const可以用在类型说明符前,也 ...
- Mybatis基本用法--上
Mybatis基本用法--上 本文只是为自己查漏补缺.全面的请看官方文档,支持中英文 原理参考:http://blog.csdn.net/luanlouis/article/details/40422 ...
随机推荐
- oracle 触发器实现主键自增
drop table book; --创建表 create table book( bookId varchar2() primary key, name varchar2() ); --创建序列 c ...
- MySQL(三) —— 约束以及修改数据表
约束: 1. 约束保证数据的完整性和一致性: 2. 约束分为表级约束和列级约束: 3. 约束类型包括:NOT NULL, PRIMARY KEY, UNIQUE KEY, DEFAULT, FOREI ...
- 程序间数据共享与传递:EXPORT/IMPORT、SAP/ABAP Memory
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 屏幕序列Screen Sequences
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 【VB6笔记-01】 读取Excel绑定到DataGrid
Private Sub cmdOpen_Click() CommonDialog1.Filter = "Excel???t(*.xlsx)|*.xlsx" CommonDialog ...
- 【CC评网】2013.第39周 漂亮的作息表
作息表 网上看到一份夏令时的作息表,让人羡慕不已: 5:00 起床——迷糊5分钟,喝500ML白开水,坐马桶看Google reader 5:20 小区6KM(大约25min—30min)+100个俯 ...
- HDU1045 Fire Net(DFS)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit: 2000/1000 MS (Java/Others) ...
- php 判断 xml 里是否存在某个节点
参考网址:http://blog.csdn.net/crazyboy2005/article/details/6114454 DOMDocument中,怎样判断某节点是否存在呢? /* $xml-&g ...
- fFFmpeg 命令、案例、测试集中营
gitbook: https://www.gitbook.com/book/xdsnet/other-doc-cn-ffmpeg/details ffmpeg [全局选项] {[输入文件选项] -i ...
- js-------》(小效果)实现倒计时及时间对象
js实现倒计时及时间对象 JS实现倒计时效果代码如下: 1 <!doctype html> 2 <html> 3 <head> 4 <meta charset ...