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

 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++中,类成员函数的使用

最新文章

  1. 小数5.2500四舍五入保留1位小数的java算法之一
  2. CSS基本语法
  3. display:-webkit-box
  4. Code 128 规则解析
  5. ILOG的一个基本应用——解决运输问题、转运问题
  6. [Nginx 1] Nginx简介
  7. BGP学习笔记
  8. UVA 10673 扩展欧几里得
  9. java中hashcode和equals的区别和联系
  10. web前端对上传的文件进行类型大小判断的js自定义函数
  11. 编译U-boot时,make[1]: *** 没有规则可以创建mkimage.o”
  12. Android ListView 删除动画
  13. C++对C语言的非面向对象特性扩充(3)
  14. STC-单片机控制系统
  15. Maven 项目管理工具基础入门系列(二)
  16. 利用dladdr来获得so自身的路径
  17. python环境下使用tab自动补全命令
  18. 电脑已连接wifi的密码查询
  19. xml根据属性去重。如csprj去重
  20. C# 压缩图片到指定宽度,假如图片小于指定宽度 判断图片大小是否大于指定大小(KB) 如果大于则压缩图片质量 宽高不变

热门文章

  1. 「题目代码」P1034~P1038(Java)
  2. 自动化测试--封装JDBCUnit
  3. 1003 Emergency (25 分)(求最短路径)
  4. AcCoder Contest-115 D - Christmas
  5. LeetCode 81——搜索旋转排序数组 II
  6. redis基础和通用key操作
  7. vue实战(一):利用vue与ajax实现增删改查
  8. WCF 透明代理
  9. Dubbo 项目与传统项目
  10. [bzoj2901]矩阵求和