[C++] Const详解
/****************************************************************
初级理解:
1.const是定义常量 ==》const意味着只读
2.以下const的变量必须初始化!
***************************************************************/
/*----------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
原因分析:
const在C语言中是以分配内存的形式出现的!这样的话,就容易让指针有机可乘
C语言中const变量是只读变量,有自己的存储空间 const在C++中并不分配内存,而是放在了一个符号表里,表目是:key value
->编译过程中若发现使用常量则直接以符号表中的值替换 ->编译过程中若发现对const使用了 extern 或者 &操作符,
则给对应的常量(如下面的符号表里a对应的常量10)分配内存空间(兼容C),然后将指针变量p指向这个内存空间 C++中的const常量
A.可能不分配存储空间
...
B.也可能分配存储空间
1).当const常量为全局,并且需要在其它文件中使用
2).当使用&操作符取const常量的地址 Const和define的区别
C.1 const常量是由编译器处理的,提供类型检查和作用域检查
C.2 宏定义由预处理器处理,单纯的文本替换 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ #include <iostream>
#include <cstdio>
#include <cstdlib> extern const int test = ;//test如果要在别的文件共用,则不管是声明 还是 定义 都必须添加 extern struct Teacher{
char name[];
int age;
}; int main(void) {
// const int a; //等价于 int const a; 代表一个常整形数a
//
// const int * c;//c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改)
//
// int * const d;// d是常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)
//
// const int * const e;//e一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改) const int a = ; int *p = (int*)&a;//必须人为的将const int* 转化为 int*
//将符号表里a对应的10取出来建立一个独立的内存空间,并将p指向这个内存空间
printf("original a = %d\r\n", a);
*p = ;
printf("modify a = %d\r\n", a);
//实际打印的是符号表里的a
printf("modify *p = %d\r\n", *p);
printf("同样的代码如果放在C编译器里,则为 10 11 和 11 .\r\n"); return ;
} /*————————————————————————————————————————————————
Const的两个应用
————————————————————————————————————————————————*/ /*指针变量名->成员名 == (*指针变量名).成员名 */
int fun(const Teacher *p) {
//Const修改形参的时候,在利用形参不能修改指针所向的内存空间,减少bug
// p->age = 10;//【err】
// p = NULL;//【ok】
} int func(Teacher * const p) {
// Const修改形参的时候,在利用形参不能修改指针本身,但可以修改所指向的内存
// p->age = 10;//【ok】
// p = 0; //【err】
}
[C++] Const详解的更多相关文章
- const详解
详解C++中的const关键字
- C++中的指针(*)、引用(&)、const详解(一、定义变量)
一.前言 本人作为一个工作了5年的程序员,程序生涯最初是从c/c++开始的,但是始终不能很熟悉的理解c语言中的指针和c++中的引用,归其原因,一部分自己没有静下心来思考,一部分原因是其自身的复杂性. ...
- C++中的const详解
const的用法,特别是用在函数后面 在普通的非 const成员函数中,this的类型是一个指向类类型的 const指针.可以改变this所指向的值,但不能改变 this所保存的地址. 在 const ...
- C++ 中的 const 详解
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4235721.html 1.为什么使用 const int 而不使用 #define 在使用# ...
- C++ 常量类型 const 详解
1.什么是const? 常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的.(当然,我们可以偷梁换柱进行更新:) 2.为什么引入const? const 推出的初始目的 ...
- let与const详解
在ES6中,js首次引入了块级作用域的概念,而什么是块级作用域? 众所就知,在js当中存在预解析的概念,就是变量提升.并且只存在全局作用域和私有作用域.在全局定义的变量就是全局变量,而在函数内部定义的 ...
- [js高手之路] es6系列教程 - var, let, const详解
function show( flag ){ console.log( a ); if( flag ){ var a = 'ghostwu'; return a; } else { console.l ...
- ES6 let和const详解及使用细节
ES6之前javascript只有全局作用域和函数作用域,所以经常会遇到变量提升了或者使用闭包的时候出错的问题. 所有a[i]都会输出10: var arr=[]; for (var i=0;i< ...
- ES6中let和const详解
let和var一样也是用来定义变量,不同之处在于let是块级作用域,只在所定义的块级作用域中生效,一个花括号便是一个块级作用域 {var a="我是var定义的";let b=&q ...
- 函数新特性、内联函数、const详解
一.函数回顾与后置返回类型 函数定义中,形参如果在函数体内用不到的话,则可以不给形参变量名字,只给其类型. 函数声明时,可以只有形参类型,没有形参名 把函数返回类型放到函数名字之前,这种写法,叫前置返 ...
随机推荐
- BZOJ 2824: [AHOI2012]铁盘整理
BZOJ 2824: [AHOI2012]铁盘整理 标签(空格分隔): OI-BZOJ OI-搜索 Time Limit: 10 Sec Memory Limit: 128 MB Descriptio ...
- 用命令关键字(Cmdlet Keyworlds)编写面向管道的脚本
使用begin process和end关键字 把你的脚本分成 初始化 处理和清楚几个区域
- python web应用--web框架(三)
了解了WSGI框架,我们发现:其实一个Web App,就是写一个WSGI的处理函数,针对每个HTTP请求进行响应. 但是如何处理HTTP请求不是问题,问题是如何处理100个不同的URL. 每一个URL ...
- VedioCapture
国内的技术的浮躁可见一般,在一个用了七八年的项目里面使用的类,居然拼写都是错的,在网上一搜,转载的也大有人在,最低级的错误,你可以不懂编程,但是只要上过高中,Video这个单词总该学过吧,居然转载的时 ...
- jQuery序列化表单为JSON对象
<form id="myform"> <table> <tr> <td>姓名:</td> <td> < ...
- 旧文备份:Python国际化支持
Python通过gettext模块支持国际化(i18n),可以实现程序的多语言界面的支持,下面是我的多语言支持实现: 在python安装目录下的./Tools/i18n/(windows下例 D:\P ...
- 第8条:覆盖equals时请遵守通用约定
第8条:覆盖equals时请遵守通用约定 引言:尽管Object是一个具体类,但是设计它主要是为了拓展.它所有的非final方法(equals.hashCode.toString.clone和fina ...
- iOS网络图片缓存详解
在开发移动应用的时候比如Android,IOS,因为手机流量.网速.内存等这些因素,当我们的移动应用是针对互联网,并要频繁访问网络的话,对网络优化这块就显得尤为重要了. 比如某个应用要经常显示网络图片 ...
- Eclipse编写JavaFX环境配置
配置eclipse用于写JavaFX:1.确定JRE中有jfxrt.jar---jdk82.选中项目-->属性-->Java Build Path3.Libraries-->jre包 ...
- vue学习--Props
Props: props用以从父组件接收数据: 使用: Vue.component('child',{ ...