对于如下几个语句,哪些定义相同?哪些定义不同?哪些数据可修改?哪些数据不可修改呢?

 const int a;
int const a;
const int *a;
int *const a;
int const *const a;

在C/C++中,const是一个数据类型修饰符,常见的还有short、long、unsigned、static、extern等,定义变量的方式采用:

(修饰符+数据类型) 变量名称

注意:如果有修饰符,则修饰符和数据类型的位置不影响变量的定义,比如int short和 short int语义是一样的。

因此,const int a 与 int const a 所表达的意思相同,都是定义了一个const int型的变量,数值不可修改。

对于指针变量类型的理解:

首先()、[]、*这三个符号的优先级依次降低,所以下面两个语句意思不同:

 int *a[]; // 定义了一个10位数组,每个成员都是指向int的指针
int (*a)[];//定义了一个指针,指针指向了一个有10个int型的数组

同时需要记住指针作用是从右往左。

在回过头来看后三个语句,就很容易发现:

const int *a表示a是一个指针,指向了const int型,指向的数据不可修改;

int *const a表示const a 是一个指针,指向了一个int型,指向的数据可以修改,指针不能指向别的地址了;

int const *const a表示const a是一个指针,指向了一个const int 型,指向的数据不可修改,指针也不能指向别的地址了。

注意:

typedef void* VP;
const VP ptr;
const void *ptr;

两个ptr的定义是否相同?答案是不同。typedef定义的是一种新的数据类型,因此const VP ptr 与 VP const ptr语义相同,所以在这句中ptr是一个const类型,存储在代码段里;而const void *ptr是一个普通指针,指向了const void类型的数据,它可以指向别的地方,存储在数据段里。因此两个语句存储位置不一样。

为什么要用const?

  1. 给别的程序员传递一种信息:不要修改这个值;
  2. 有可能让编译器产生精简的代码?减少bug?(目前不太理解这句话)
  3. 合理保护只读数据;

使用位置:

  1. 定义常量,防止被修改;
  2. 函数参数,防止函数修改作为函数参数的变量值
  3. 在C++中,类成员函数的使用

C/C++里的const(2)的更多相关文章

  1. C/C++里的const(1)

    首先来看这样一段程序: #include<iostream> using namespace std; int main(){ char *s = "hello world&qu ...

  2. 类里面的非static const成员

    类里面的成员变量可以用const修饰,在只用const不用static修饰的情况下,这种使用的限制比较多 (1)不能定义处初始化,必须在类的构造函数初始化列表里面初始化(虽然在vs中,可以在定义处初始 ...

  3. 为什么为 const 变量重新赋值不是个静态错误

    const 和 let 的唯一区别就是用 const 声明的变量不能被重新赋值(只读变量),比如像下面这样就会报错: const foo = 1 foo = 2 // TypeError: Assig ...

  4. C++中的const和指针组合

    在C++里,const修饰指针有以下三种情况 (1)指针常量:即指向常量的指针 const  int *p或者int const *p const在*前,,可以这样理解它的功能,因为const在*前, ...

  5. (转) C++ static、const和static const 以及它们的初始化

    const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. static表示的是静态的.类的静态成员函数.静态成员变量是和类相关的,而不是和类的 ...

  6. C++ static、const和static const 以及它们的初始化

    转自C++ static.const和static const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. s ...

  7. C++中如何修改const变量

      一.结论 声明:不同于C语言的const变量修改问题(可以通过指针间接修改const变量的值),这里只讨论C++ 里的const. C++ const 修饰符,表示常量,即如果以后保证不会修改则声 ...

  8. KEIL C51中const和code的使用

    code是KEIL C51 扩展的关键字,用code修饰的变量将会被放到CODE区里.但C语里的const关键字好像也有定义不能改变的变量的功能,这两个关键字有什么区别呢?在帮助手册里查找const, ...

  9. const形参与非const形参

    在程序设计中我们会经常调用函数,调用函数就会涉及参数的问题,那么在形参列表中const形参与非const形参对传递过来的实参有什么要求呢? 先来看一个简单的例子: #include <iostr ...

随机推荐

  1. 接口自动化测试框架Karate入门

    介绍 在这篇文章中,我们将介绍一下开源的Web-API自动化测试框架--Karate Karate是基于另一个BDD测试框架Cucumber来建立的,并且共用了一些相同的思想.其中之一就是使用Gher ...

  2. mysql修改外部访问权限

    mysql>use mysql; mysql>update user set host =’%’ where user=’root’ mysql>select host,user f ...

  3. 机器学习sklearn的快速使用--周振洋

    ML神器:sklearn的快速使用 传统的机器学习任务从开始到建模的一般流程是:获取数据 -> 数据预处理 -> 训练建模 -> 模型评估 -> 预测,分类.本文我们将依据传统 ...

  4. 6.爬虫 requests库讲解 总结

    requests库的总结: 用ProcessOn根据前面的几节内容做了个思维导图:

  5. kaldi GMM模型解码指令 gmm-latgen-faster详解

    目录 - 作用: - 用法: - 可选项及含义: - 使用实例: - 作用: Generate lattices using GMM-based model. 生成基于GMM模型的lattice词格) ...

  6. 搞ACM的伤不起

    劳资六年前开始搞ACM啊!!!!!!!!!!  从此踏上了尼玛不归路啊!!!!!!!!!!!!  谁特么跟劳资讲算法是程序设计的核心啊!!!!!!  尼玛除了面试题就没见过用算法的地方啊!!!!!!  ...

  7. 福大软工1816:Alpha(2/10)

    Alpha 冲刺 (2/10) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务: 文字/口头描述: 1.学习qqbot库: 2.实 ...

  8. iterator 的设计原则和traits

    iterator我前面写过是作为algorithm和container之间的一个桥梁,algorithm进程操作的时候向iterator进行提问,iterator并对提问进行了回答,其中主要就是回答5 ...

  9. lintcode-119-编辑距离

    119-编辑距离 给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数. 你总共三种操作方法: 插入一个字符 删除一个字符 替换一个字符 样例 给出 work1=&q ...

  10. http请求的过程

    http请求格式: http请求格式由四部分组成,分别是:请求行,请求头,空行,消息体,每个部分占一行. 请求行是消息体的第一行,由三部分组成,分别是:请求方法,请求资源的url,http的版本号. ...