/****************************************************************
初级理解:
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详解的更多相关文章

  1. const详解

    详解C++中的const关键字

  2. C++中的指针(*)、引用(&)、const详解(一、定义变量)

    一.前言 本人作为一个工作了5年的程序员,程序生涯最初是从c/c++开始的,但是始终不能很熟悉的理解c语言中的指针和c++中的引用,归其原因,一部分自己没有静下心来思考,一部分原因是其自身的复杂性. ...

  3. C++中的const详解

    const的用法,特别是用在函数后面 在普通的非 const成员函数中,this的类型是一个指向类类型的 const指针.可以改变this所指向的值,但不能改变 this所保存的地址. 在 const ...

  4. C++ 中的 const 详解

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4235721.html 1.为什么使用 const int 而不使用 #define 在使用# ...

  5. C++ 常量类型 const 详解

    1.什么是const? 常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的.(当然,我们可以偷梁换柱进行更新:) 2.为什么引入const? const 推出的初始目的 ...

  6. let与const详解

    在ES6中,js首次引入了块级作用域的概念,而什么是块级作用域? 众所就知,在js当中存在预解析的概念,就是变量提升.并且只存在全局作用域和私有作用域.在全局定义的变量就是全局变量,而在函数内部定义的 ...

  7. [js高手之路] es6系列教程 - var, let, const详解

    function show( flag ){ console.log( a ); if( flag ){ var a = 'ghostwu'; return a; } else { console.l ...

  8. ES6 let和const详解及使用细节

    ES6之前javascript只有全局作用域和函数作用域,所以经常会遇到变量提升了或者使用闭包的时候出错的问题. 所有a[i]都会输出10: var arr=[]; for (var i=0;i< ...

  9. ES6中let和const详解

    let和var一样也是用来定义变量,不同之处在于let是块级作用域,只在所定义的块级作用域中生效,一个花括号便是一个块级作用域 {var a="我是var定义的";let b=&q ...

  10. 函数新特性、内联函数、const详解

    一.函数回顾与后置返回类型 函数定义中,形参如果在函数体内用不到的话,则可以不给形参变量名字,只给其类型. 函数声明时,可以只有形参类型,没有形参名 把函数返回类型放到函数名字之前,这种写法,叫前置返 ...

随机推荐

  1. IOC、注入

    转:https://blog.csdn.net/lutianfeiml/article/details/51731219 实际开发中使用XML还是注解 XML: bean管理 注解: 注入属性的时候比 ...

  2. leetCode没那么难啦 in Java (一)

    前言    感觉写博客是一个很耗心力的东西T_T,简单的写了似乎没什么用,复杂的三言两语也只能讲个大概,呸呸...怎么能有这些消极思想呢QAQ!那想来想去,先开一个leetcode的坑,虽然已经工作了 ...

  3. 洛谷P1762 偶数(找规律)

    题目描述 给定一个正整数n,请输出杨辉三角形前n行的偶数个数对1000003取模后的结果. 输入输出格式 输入格式: 一个数 输出格式: 结果 输入输出样例 输入样例#1: 复制 6 输出样例#1:  ...

  4. Java - 基础数据类型的极值

  5. python 获取项目的根路径

    root_path = os.path.abspath(os.path.dirname(__file__)).split('shippingSchedule')[0] shippingSchedule ...

  6. rsync + git发布项目

    前言: 更新项目的时候需要将更改的文件一一上传,这样比较麻烦,用版本控制器git +rsync 搭建一个发布服务器,以后发布文件非常方便 首先说下,我这边的更新流程,本地写完之后,git push 到 ...

  7. Linux Kernel ---- PCI Driver 分析

    自己笔记使用. Kernel 版本 4.15.0 (ubuntu 18.04,intel skylake) 最近想学习VGA驱动去了解 DDCCP / EDID 等协议,然后顺便了解下驱动是如何工作的 ...

  8. 基本数据类型补充,set集合,深浅拷贝等

    1.join:将字符串,列表,用指定的字符连接,也可以用空去连接,这样就可以把列表变成str ll = ["wang","jian","wei&quo ...

  9. 从0开始学习 Git

    1. 什么是Git? Git 是 Linux 发明者 Linus 开发的一款新时代的版本控制系统,那什么是版本控制系统呢?怎么理解?网上一大堆详细的介绍,但是大多枯燥乏味,对于新手也很难理解,这里我只 ...

  10. PLC状态机编程第四篇-历史状态处理

    今天我们接着上次的控制任务,加入历史状态,这个任务会比较复杂,象这样的任务我们倾向于自动生成PLC程序,自己写容易出错.但为了演示,我们可以尝试一下.言归正传,下面是我们的控制任务. 控制任务 这次的 ...