[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详解
一.函数回顾与后置返回类型 函数定义中,形参如果在函数体内用不到的话,则可以不给形参变量名字,只给其类型. 函数声明时,可以只有形参类型,没有形参名 把函数返回类型放到函数名字之前,这种写法,叫前置返 ...
随机推荐
- 【转】VMware虚拟机系统无法上网怎么办?
有很多用户通过安装VMware软件来创建虚拟机系统,其中就有部分用户在创建好虚拟机系统后遇到无法上网的问题,下面PC6苹果网小编就给大家带来VMware虚拟机系统下无法上网的解决办法: 1.在虚拟机右 ...
- python中那个断言assert的优化
Python Assert 为何不尽如人意# Python中的断言用起来非常简单,你可以在assert后面跟上任意判断条件,如果断言失败则会抛出异常. Copy >>> assert ...
- django.template.exceptions.TemplateSyntaxError: 'article_tags' is not a registered tag library.
django.template.exceptions.TemplateSyntaxError: 'article_tags' is not a registered tag library. Must ...
- Mybatis-generator自动生成
第一步:导入架包 <build> <plugins> <plugin> <groupId>org.mybatis.generator</group ...
- webapi中配置返回的时间数据格式
web api返回的是标准格式UTC时间,如果要转成我们需要的格式,可以在WebApiConfig.cs的Register函数中新增以下配置来定义返回的时间类型格式: //配置返回的时间类型数据格式 ...
- 深入理解PHP7之zval
PHP7已经发布, 如承诺, 我也要开始这个系列的文章的编写, 今天我想先和大家聊聊zval的变化. 在讲zval变化的之前我们先来看看zval在PHP5下面是什么样子 PHP5zval回顾在PHP5 ...
- php中==和===的含义及区别
===比较两个变量的值和类型:==比较两个变量的值,不比较数据类型. 比如 $a = '123'; $b = 123; $a === $b为假: $a == $b为真: 有些情况下不能使用==,可以使 ...
- yii2深入理解之内核解析
一.前言 首先,yii2最为为数不多的PHP主流开源框架,受欢迎程度不亚于laravel和TP.个人认为,研究这些框架底层代码是非常有助于自身代码编程思想的提升和代码简化程度和质量的提升的. 那么,话 ...
- C语言指针篇(二)多级指针
多级指针 多级指针常常使用于数组.这里仅仅介绍一下它长什么样,后文会再次详细对比使用. 多级指针呢,常见的有二级指针.见图. 二级指针的 ...
- 汉罗塔问题——Python
汉罗塔问题就是一个循环的过程:* (有两种情况) 如果被移动盘只有一个盘子,可以直接移动到目的盘 但是被移动盘有多个盘子,就先需要将上面的n-1个盘子通过目的盘移动到辅助盘,然后将被移动盘最下面一个盘 ...