[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详解
一.函数回顾与后置返回类型 函数定义中,形参如果在函数体内用不到的话,则可以不给形参变量名字,只给其类型. 函数声明时,可以只有形参类型,没有形参名 把函数返回类型放到函数名字之前,这种写法,叫前置返 ...
随机推荐
- 问题 C: P4 游戏中的Human角色
题目描述 在一个平面打斗游戏中,任何的角色(Role)都有血量(blood)和位置loc(此处loc是Location类的实例)属性.有了Role类,可以派生出不同的角色,如人.神仙.怪兽等.如下程序 ...
- RandomUserAgentMiddleware练习
# 请求头添加随机user-agent class RandomUserAgentMiddleware(object): def __init__(self, agents): self.agent ...
- Mybatis-generator自动生成
第一步:导入架包 <build> <plugins> <plugin> <groupId>org.mybatis.generator</group ...
- 【洛谷P1063】NOIP2006能量项链
能量项链 https://www.luogu.org/problemnew/show/P1063 好像比合并石子更水.. 区间动规,f[l][r]表示合并区间l~r的最大能量 按区间长度dp 枚举中间 ...
- cudaMallocPitch – 向GPU分配存储器
概要 cudaError_t cudaMallocPitch( void** devPtr,size_t* pitch,size_t widthInBytes,size_t height ) 说明 向 ...
- python—命名空间、作用域查找顺序、闭包
名称空间 name space,如下图: x = 1, 1存放在内存中,1 会有一个内存地址,x 则 存放在 name space 里,并同时记录了 1的内存地址, 即 名称空间是存放了变量x与1绑定 ...
- css英文长文字会自动换行的解决办法
iPhone5中显示的效果如下图: 代码修改: 修改后效果如图:
- JAVAOOP继承
继承:修饰符 子类 extends 父类{ //类定义部分},不可以使用private和protected修饰类 减少代码量,实现无损替换 必须符合A is a B的关系 宝马 车 狗 ...
- P2158 [SDOI2008] (欧拉函数
题目描述 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图 ...
- 输入cin对象的用法
#include<iostream> using namespace std; int main() { int carrots ; cout << "How man ...